ZGlmZiAtLWdpdCBhL0RldGFpbGVkX1Rlc3RpbmdfTWV0aG9kb2xvZ3kuZG9jeCBiL0RldGFpbGVkX1Rlc3RpbmdfTWV0aG9kb2xvZ3kuZG9jeApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NDg2Ni4uMDAwMDAwMAotLS0gYS9EZXRhaWxlZF9UZXN0aW5nX01ldGhvZG9sb2d5LmRvY3gKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9EZXRhaWxlZF9UZXN0aW5nX01ldGhvZG9sb2d5LnR4dCBiL0RldGFpbGVkX1Rlc3RpbmdfTWV0aG9kb2xvZ3kudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzk0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9EZXRhaWxlZF9UZXN0aW5nX01ldGhvZG9sb2d5LnR4dApAQCAtMCwwICsxLDk4MSBAQAorCQkJCQkJKioqKioqKioqKiogIENvbmZvcm1hbmNlIFRlc3Qtc3VpdGUgICAqKioqKioqKioqKioqKioqCisJCQkJCQlPRi1Td2l0Y2gtMS4wLjAtVGVzdENhc2VzIGRldGFpbGVkIHRlc3RpbmcgbWV0aG9kb2xvZ3kKKworCisKKworCisqKioqICAgICBPcGVuZmxvdyBwcm90b2NvbCBtZXNzYWdlcyAgICAgKioqKgorCisKKworMS4gRmVhdHVyZXMgUmVxdWVzdAorCitUZXN0IERlc2NyaXB0aW9uOiBDaGVjayBmZWF0dXJlcyByZXF1ZXN0IGlzIGltcGxlbWVudGVkCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiBGZWF0dXJlc1JlcXVlc3QKK1BvcnRzOiBJIChDb250cm9sIFBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBTZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczogCisKK2EpIFNlbmQgT0ZQVF9GRUFUVVJFU19SRVFVRVNUIGZyb20gY29udHJvbGxlci4KK2IpIFZlcmlmeSBPRlBUX0ZFQVRVUkVTX1JFUExZIGlzIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzCisKKworCisyLiBDb25maWd1cmF0aW9uIHJlcXVlc3QKKworVGVzdCBEZXNjcmlwdGlvbjogQ2hlY2sgYmFzaWMgZ2V0IGNvbmZpZ3VyYXRpb24gcmVxdWVzdCBpcyBpbXBsZW1lbnRlZAorCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogQ29uZmlndXJhdGlvblJlcXVlc3QKK1BvcnRzOiBJIChDb250cm9sIFBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBTZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgU2VuZCBPRlBUX0dFVF9DT05GSUdfUkVRVUVTVAorYikgVmVyaWZ5IE9GUFRfR0VUX0NPTkZJR19SRVBMWSBpcyByZWNlaXZlZCB3aXRob3V0IGVycm9ycy4KKworCisKKzMuIE1vZGlmeSBTdGF0ZSAoQUREKQorCitUZXN0IERlc2NyaXB0aW9uOiBDaGVjayBiYXNpYyBGbG93IEFERCByZXF1ZXN0IGlzIGltcGxlbWVudGVkCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiBNb2RpZnlTdGF0ZUFkZAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIGRhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gU2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QgTm90ZXM6CisKK2EpIFNlbmQgT0ZQVF9GTE9XX01PRCwgY29tbWFuZCA9IE9GUEZDX0FERCAKK2IpIFNlbmQgb2ZwX3RhYmxlX3N0YXRzIHJlcXVlc3QgCitjKSBWZXJpZnkgdGhhdCBhY3RpdmVfY291bnQ9MSBpbiB0aGUgcmVwbHkKKworCisKKworNC4gTW9kaWZ5IFN0YXRlIChERUxFVEUpCisKK1Rlc3QgRGVzY3JpcHRpb246IENoZWNrIGJhc2ljIEZsb3cgRGVsZXRlIHJlcXVlc3QgaXMgaW1wbGVtZW50ZWQKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6IE1vZGlmeVN0YXRlRGVsZXRlCitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIDIgZGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBTZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgU2VuZCBPRlBUX0ZMT1dfTU9ELCBjb21tYW5kID0gT0ZQRkNfQUREIAorYikgU2VuZCBvZnBfdGFibGVfc3RhdHMgcmVxdWVzdAorYykgVmVyaWZ5IHRoYXQgYWN0aXZlX2NvdW50PTEgaW4gdGhlIHJlcGx5CitkKSBTZW5kIE9GUFRfRkxPV19NT0QsIGNvbW1hbmQgPSBPRlBGQ19ERUxFVEUKK2UpIFNlbmQgb2ZwX3RhYmxlX3N0YXRzIHJlcXVlc3QKK2YpICBWZXJpZnkgYWN0aXZlIF9jb3VudD0wIGluIHRoZSByZXBseQorCisKKworNS4gTW9kaWZ5IFN0YXRlIChNT0RJRlkpCisKK1Rlc3QgRGVzY3JpcHRpb246IENoZWNrIGJhc2ljIEZsb3cgTW9kaWZ5IHJlcXVlc3QgaXMgaW1wbGVtZW50ZWQKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6IE1vZGlmeVN0YXRlTW9kaWZ5CitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIGFuZCAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gU2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QgTm90ZXM6CisKK2EpIFNlbmQgIE9GUFRfRkxPV19NT0QgLCBjb21tYW5kID0gT0ZQRkNfQURELCBhY3Rpb24gQQorYikgU2VuZCBvZnBfdGFibGVfc3RhdHMgcmVxdWVzdCwgVmVyaWZ5ICBhY3RpdmVfY291bnQ9MQorYykgU2VuZCBPRlBUX0ZMT1dfTU9EICwgY29tbWFuZCA9IE9GUEZDX01PRElGWSwgYWN0aW9uIEGSCitkKSBTZW5kIFRlc3QgUGFja2V0ICBtYXRjaGluZyB0aGUgZmxvdworZSkgVmVyaWZ5IHBhY2tldCBpbXBsZW1lbnRzIGFjdGlvbiBBkgorCisKKworNi4gUmVhZCBTdGF0ZQorCitUZXN0IERlc2NyaXB0aW9uOiBDaGVjayBiYXNpYyBSZWFkIFN0YXRlIGlzIGltcGxlbWVudGVkCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiBSZWFkU3RhdGUKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUsIDIgZGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBTZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgU2VuZCAgT0ZQVF9GTE9XX01PRCwgY29tbWFuZCA9IE9GUEZDX0FERAorYikgQ3JlYXRlIGEgT0ZQQ19GTE9XX1NUQVRTIG1lc3NhZ2UgYW5kIHNlbmQgaXQKK2MpIFZlcmlmeSBzd2l0Y2ggcmVwbGllcyB3aXRob3V0IGVycm9ycworCisKKworNy4gU2VuZCBwYWNrZXQKKworVGVzdCBEZXNjcmlwdGlvbjogQ2hlY2sgYmFzaWMgU2VuZC1QYWNrZXQgaXMgaW1wbGVtZW50ZWQuIAorCQkgIFNlbmQtUGFja2V0OiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgY29udHJvbGxlciB0byBzZW5kIHBhY2tldHMgb3V0IG9mIGEgc3BlY2lmaWVkIHBvcnQgb24gdGhlIHN3aXRjaC4KKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBTZW5kUGFja2V0CitQb3J0czogNSAoMSBDb250cm9sIFBsYW5lLCA0IERhdGFwbGFuZSkgCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIFNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBTZW5kIE9GUFRfUEFDS0VUX09VVCBvdXQgbWVzc2FnZSBmcm9tIGNvbnRyb2xsZXIgdG8gc3dpdGNoIGZvciBldmVyeSBkYXRhcGxhbmUgcG9ydC4KK2IpIFZlcmlmeSB0aGUgcGFja2V0IGFwcGVhcnMgb24gdGhlIGVhY2ggZGF0YXBsYW5lIHBvcnQKK2MpIFZlcmlmeSBzZW50IHBhY2tldCBtYXRjaGVzIHRoZSByZWNlaXZlZCBwYWNrZXQKKworCisKKzguIEJhcnJpZXIgUmVxdWVzdCAKKworVGVzdCBEZXNjcmlwdGlvbjogVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IGEgYmFzaWMgYmFycmllciByZXF1ZXN0IGRvZXMgbm90IGdlbmVyYXRlIGFuIGVycm9yLgorCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogQmFycmllclJlcXVlc3RSZXBseQorUG9ydHM6IEkgKENvbnRyb2wgUGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIFNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBTZW5kIE9GUFRfQkFSUklFUl9SRVFVRVNUCitjKSBWZXJpZnkgT0ZQVF9CQVJSSUVSX1JFUExZIGlzIHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIHBsYW5lLgorCisKKworOS4gUGFja2V0IEluCisKK1Rlc3QgRGVzY3JpcHRpb246IENoZWNrIHBhY2tldF9pbiBpcyBpbXBsZW1lbnRlZC4gVGhpcyB0ZXN0IGp1c3QgY2hlY2tzIHRoYXQgbm9uIG1hdGNoZWQgZGF0YXBsYW5lIHBhY2tldHMgCisJCSAgZ2VuZXJhdGUgYSBwYWNrZXRfaW4KKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6IFBhY2tldEluCitQb3J0czogMiAoMSBDb250cm9sIFBsYW5lIGFuZCAxIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gU2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QgTm90ZXM6CisKK2EpIFNlbmQgYSBwYWNrZXQgdG8gZGF0YXBsYW5lIHBvcnQgLCB3aXRob3V0IGluc2VydGluZyBhIGZsb3cgZW50cnkKK2IpIFZlcmlmeSBhIE9GUFRfUEFDS0VUX0lOIGlzIGdlbmVyYXRlZCBvbiB0aGUgY29udHJvbCBwbGFuZQorCisKKworMTAuIEhlbGxvCisKK1Rlc3QgRGVzY3JpcHRpb246IFRoaXMgdGVzdCBjaGVja3MgZm9yIGJhc2ljIEhlbGxvIG1lc3NhZ2UgZ2VuZXJhdGlvbiB3aXRoIGNvcnJlY3QgdmVyc2lvbiBmaWVsZC4KKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBIZWxsbworUG9ydHM6IDEgKENvbnRyb2wgUGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIFNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBTZW5kICBPRlBUX0hFTExPIGZyb20gY29udHJvbGxlciB0byBzd2l0Y2gKK2IpIFZlcmlmeSBzd2l0Y2ggYWxzbyBzZW5kcyBPRlBUX0hFTExPIG1lc3NhZ2UgaW4gcmVzcG9uc2UgCitjKSBWZXJpZnkgdmVyc2lvbiBmaWVsZCBpbiB0aGUgaGVsbG8gbWVzc2FnZSBpcyBzZXQgdG8gT3BlbmZsb3cgdmVyc2lvbiAxLjAuMAorCisKKworMTEuIEVjaG8KKworVGVzdCBEZXNjcmlwdGlvbjogVGhpcyB0ZXN0IGNoZWNrcyBmb3IgYmFzaWMgRWNobyBSZXBseSBtZXNzYWdlIGdlbmVyYXRpb24gd2l0aCBjb3JyZWN0IHZlcnNpb24gZmllbGQgd2l0aCAKKwkJICBzYW1lIHRyYW5zYWN0aW9uIGlkLgorCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogIEVjaG9XaXRob3V0Qm9keQorUG9ydHM6IDEgKENvbnRyb2wgUGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBTZW5kIE9GUFRfRUNIT19SRVFVRVNUIGZyb20gdGhlIGNvbnRyb2xsZXIgc2lkZS4KK2IpIFZlcmlmeSBzd2l0Y2ggcmVzcG9uZHMgYmFjayB3aXRoIE9GUFRfRUNIT19SRVBMWSB3aXRoIHNhbWUgeGlkLgorYykgVmVyaWZ5IE9wZW5mbG93IHZlcnNpb24gaW4gaGVhZGVyIGlzIHNldCB0byBPcGVuZmxvdyB2ZXJzaW9uIDEuMC4wLgorCisKKworCisKKyoqKiogICAgIERldGFpbGVkIGNvbnRyb2xsZXIgdG8gc3dpdGNoIG1lc3NhZ2VzICAgICAqKioqCisKKworCisxLiBPdmVybGFwIGNoZWNraW5nCisKK1Rlc3QgRGVzY3JpcHRpb246IFZlcmlmeSB0aGF0IGlmIG92ZXJsYXAgY2hlY2sgZmxhZyBpcyBzZXQgaW4gdGhlIGZsb3cgZW50cnkgYW5kIGFuIG92ZXJsYXBwaW5nIGZsb3cgaXMgCisJCSAgaW5zZXJ0ZWQgdGhlbiBhbiBlcnJvciBpcyBnZW5lcmF0ZWQgYW5kIHN3aXRjaCByZWZ1c2VzIGZsb3cgZW50cnkKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBPdmVybGFwQ2hlY2tpbmcKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBkYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0LU5vdGVzOgorCithKSBHZW5lcmF0ZSBGbG93IEYxLS0+IFdpbGRjYXJkIEFsbCAKK2IpIFNlbmQgb2ZwX3RhYmxlX3N0YXRzIHJlcXVlc3QgLCB2ZXJpZnkgYWN0aXZlX2NvdW50PTEKK2MpIEdlbmVyYXRlIG92ZXJsYXBwaW5nIGZsb3cgRjIgLS0+IFdpbGRjYXJkIEFsbCBFeGNlcHQgSW5ncmVzcyBQb3J0ICggd2l0aCBmbGFnIE9GUEZGX0NIRUNLX09WRVJMQVAgc2V0KQorZCkgVmVyaWZ5IHRoYXQgc3dpdGNoIGdlbmVyYXRlcyBPRlBUX0VSUk9SIG1zZy4gIAorICAgVHlwZTogT0ZQRVRfRkxPV19NT0RfRkFJTEVEIGNvZGUgOiBPRlBGTUZDX09WRVJMQVAgCisKKworCisyLiBObyBvdmVybGFwIGNoZWNraW5nCisKK1Rlc3QgRGVzY3JpcHRpb246IFZlcmlmeSB0aGF0IHdpdGhvdXQgb3ZlcmxhcCBjaGVjayBmbGFnIHNldCwgb3ZlcmxhcHBpbmcgZmxvd3MgY2FuIGJlIGNyZWF0ZWQuCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgTm9PdmVybGFwY2hlY2tpbmcKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUsIDIgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBzZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgR2VuZXJhdGUgRmxvdyBGMS0tPiBXaWxkY2FyZCBBbGwuCitiKSBTZW5kIG9mcF90YWJsZV9zdGF0cyByZXF1ZXN0ICwgdmVyaWZ5IGFjdGl2ZV9jb3VudD0xCitlKSBHZW5lcmF0ZSBvdmVybGFwcGluZyBmbG93IEYyIC0tPiBXaWxkY2FyZCBBbGwgRXhjZXB0IEluZ3Jlc3MgUG9ydCAoIHdpdGhvdXQgZmxhZyBPRlBGRl9DSEVDS19PVkVSTEFQIHNldCkKK2MpIFNlbmQgYSBvZnBfdGFibGVfc3RhdHMgcmVxdWVzdCwgdmVyaWZ5IGFjdGl2ZV9jb3VudD0yCisKKworCiszLiBJZGVudGljYWwgZmxvd3MgCisKK1Rlc3QgRGVzY3JpcHRpb246IFZlcmlmeSB0aGF0IGFkZGluZyB0d28gaWRlbnRpY2FsIGZsb3dzIG92ZXJ3cml0ZXMgdGhlIGV4aXN0aW5nIG9uZSBhbmQgY2xlYXJzIGNvdW50ZXJzCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgSWRlbnRpY2FsRmxvd3MKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUpLCAoMiBkYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBHZW5lcmF0ZSBGbG93IEYxLgorYikgU2VuZCBvZnBfdGFibGVfc3RhdHMgcmVxdWVzdCAsIHZlcmlmeSBhY3RpdmVfY291bnQ9MQorYikgSW5jcmVtZW50IGNvdW50ZXJzIChwYWNrZXRfY291bnQsIGJ5dGVfY291bnQpIGJ5IHNlbmRpbmcgYSBwYWNrZXQgbWF0Y2hpbmcgZmxvdyBGMS4KK0MpIFNlbmQgb2ZwX2Zsb3dfc3RhdHMgcmVxdWVzdC4gVmVyaWZ5IGZsb3cgY291bnRlcnM6IGJ5dGVfY291bnQgYW5kIHBhY2tldF9jb3VudCAKK2MpIENyZWF0ZSBpZGVudGljYWwgZmxvdyBGMgorZCkgU2VuZCBhIG9mcF90YWJsZV9zdGF0cyByZXF1ZXN0LCB2ZXJpZnkgYWN0aXZlX2NvdW50PTEKK2UpIFNlbmQgb2ZwX2Zsb3dfc3RhdHMgcmVxdWVzdC4gVmVyaWZ5IGZsb3cgY291bnRlcnM6IGJ5dGVfY291bnQgYW5kIHBhY2tldF9jb3VudCBhcmUgcmVzZXQKKworCisKKzQuIE5vIHRhYmxlIHRvIGFkZCAoV3JpdHRlbiBpbiBvZnRlc3SXTmVlZCB0byBhZGQgdG8gY29uZm9ybWFuY2UgVGVzdC1TdWl0ZXMpCisKKworCis1LiBOZXZlciB2YWxpZCBwb3J0IChUQkQpCisKKworCisKKzYuIEN1cnJlbnRseSBub3QgZXhpc3RpbmcgcG9ydCBWZXJzaW9uIEEgYW5kIEIgKFRCRCkKKworCisKKworNy4gRW1lcmdlbmN5IGZsb3cgd2l0aCB0aW1lb3V0IHZhbHVlcyAKKworVGVzdCBEZXNjcmlwdGlvbjogVGltZW91dCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGZvciBlbWVyZ2VuY3kgZmxvd3MKKworVGVzdCBUaXRsZTogRW1lckZsb3dUaW1lb3V0CitUZXN0IG1vZGU6IEF1dG9tYXRlZAorUG9ydHM6IDMgKDEgY29udHJvbCBwbGFuZSwgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwIAorCisKK1Rlc3QgTm90ZXM6CisKK2EpICBHZW5lcmF0ZSBhIGZsb3cgRiB3aXRoIE9GUEZGX0VNRVJHIHNldCBpbiBmbGFnIGFuZCB0aW1lb3V0IHZhbHVlcyBhc3NpZ25lZC4KK2IpICBWZXJpZnkgc3dpdGNoIGdlbmVyYXRlcyBhbiBPRlBUX0VSUk9SIG1zZywgVHlwZTogT0ZQRVRfRkxPV19NT0RfRkFJTEVELCBDb2RlIE9GUEZNRkNfQkFEX0VNRVJHX1RJTUVPVVQKKworCisKKzguIE1pc3NpbmcgbW9kaWZ5IGFkZHMKKworVGVzdCBEZXNjcmlwdGlvbjogSWYgYSBtb2RpZnkgZG9lcyBub3QgbWF0Y2ggYW4gZXhpc3RpbmcgZmxvdywgdGhlIGZsb3cgZ2V0cyBhZGRlZC4KKworVGl0bGU6IE1pc3NpbmdNb2RpZnlBZGQKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitQb3J0czozICgxIGNvbnRyb2wgcGxhbmUsMiBEYXRhIFBsYW5lKQorSW5pdGlhbCBTdGF0ZTogQ29ubmVjdGlvbiBzZXR1cCwgQ2xlYXIgU3dpdGNoIFN0YXRlCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBHZW5lcmF0ZSBhIGZsb3ctbW9kICwgY29tbWFuZCBPRlBDX01PRElGWSAoTm90ZTogVGhlcmUgc2hvdWxkIGJlIG5vIGZsb3dzIG1hdGNoaW5nIHRoaXMgZmxvd19tb2QgbW9kaWZ5IGNvbW1hbmQpCitiKSBTZW5kIGEgb2ZwX3RhYmxlX3N0YXRzIHJlcXVlc3QsIHZlcmlmeSBhY3RpdmVfY291bnQ9MQorCisKKworCis5LiBNb2RpZnkgY2hhbmdlcyBhY3Rpb24sIHByZXNlcnZlcyBjb3VudGVycworCitUZXN0IERlc2NyaXB0aW9uOiBBIG1vZGlmaWVkIGZsb3cgcHJlc2VydmVzIGNvdW50ZXJzCisKK1RpdGxlOiBNb2RpZnlBY3Rpb24KK1Rlc3QgbW9kZTogQXV0b21hdGVkCitQb3J0czogNCgxIGNvbnRyb2wgcGxhbmUsIDMgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogQ29ubmVjdGlvbiBzZXR1cCwgQ2xlYXIgU3dpdGNoIFN0YXRlCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBDcmVhdGUgYSBmbG93X21vZCBGLTEgd2l0aCBjb21tYW5kIE9GUENfQURELCBhY3Rpb24gQQorYikgU2VuZCBhIHRlc3QgUGFja2V0IG1hdGNoaW5nIHRoZSBmbG93CitjKSBTZW5kIGFuIG9mcF9mbG93X3N0YXRzIHJlcXVlc3QsIHZlcmlmeSBieXRlX2NvdW50IGFuZCBwYWNrZXRfY291bnQKK2UpIENyZWF0ZSBmbG93X21vZCB3aXRoIGNvbW1hbmQgT0ZQQ19NT0RJRlkgLGFjdGlvbiBBkiBhbmQgbW9kaWZ5IGFjdGlvbiBvZiBmbG93IEYtMQorZikgU2VuZCBhIG9mcF9mbG93X3N0YXRzIHJlcXVlc3QsIHZlcmlmeSBmbG93IGNvdW50ZXJzIGFyZSBwcmVzZXJ2ZWQKK2cpIFNlbmQgdGVzdCBwYWNrZXQsIHZlcmlmeSBpdCBpbXBsZW1lbnRzIGFjdGlvbiBBkgorCisKKworMTAuIFN0cmljdCBNb2RpZnkgY2hhbmdlcyBhY3Rpb24sIHByZXNlcnZlcyBjb3VudGVycworCitUZXN0IERlc2NyaXB0aW9uOiBTdHJpY3QgTW9kaWZ5IEZsb3cgYWxzbyBjaGFuZ2VzIGFjdGlvbiBwcmVzZXJ2ZXMgY291bnRlcnMKKworVGl0bGU6IFN0cmljdE1vZGlmeUFjdGlvbgorVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1BvcnRzOiA0KDEgY29udHJvbCBwbGFuZSwgMyBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBDb25uZWN0aW9uIHNldHVwLCBDbGVhciBTd2l0Y2ggU3RhdGUKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QgTm90ZXM6CisKK2EpIENyZWF0ZSB0d28gb3ZlcmxhcHBpbmcgZmxvd3M6IEYgLS0+IE1hdGNoIG9uIGFsbCwgZXhjZXB0IG9uZSB3aWxkY2FyZGVkIChzcmMgYWRkcmVzcykuIEFjdGlvbiBBLiBQcmlvcml0eT0xMDAgCisgICBGkiAtLT4gTWF0Y2ggb24gaW5ncmVzc19wb3J0ID0gcG9ydCBbMF0sIHdpbGRjYXJkZWQgcmVzdC4gQWN0aW9uIEEuIFByaW9yaXR5PTEwCitiKSBTZW5kIGEgb2ZwX3RhYmxlX3N0YXRzIHJlcXVlc3QsIHZlcmlmeSBhY3RpdmVfY291bnQ9MgorYykgU2VuZCBQYWNrZXQgKGl0IHdvdWxkIGhhdmUgbWF0Y2hlZCBib3RoIHRoZSBmbG93cywgc2luY2UgdGhleSBhcmUgb3ZlcmxhcHBpbmcgZmxvd3MgYnV0IGl0IHdvdWxkIG1hdGNoIEZsb3ctRjEgYXMgaXQgaGFzIGhpZ2hlciBwcmlvcml0eS4pCitkKSBTZW5kIG9mcF9mbG93X3N0YXRzIHJlcXVlc3QgZm9yIEZsb3ctMSBhbmQgdmVyaWZ5IGNvdW50ZXJzIHBhY2tldF9jb3VudCBhbmQgYnl0ZV9jb3VudCAKK2UpIENyZWF0ZSBmbG93X21vZCAsY29tbWFuZCBPRlBDX1NUUklDVF9NT0RJRlksbWF0Y2ggb24gYWxsIGV4Y2VwdCBzcmMgYWRkcmVzcyAscHJpb3JpdHkgMTAwIGFjdGlvbiBBkgorZikgU2VuZCB0ZXN0IHBhY2tldCAsIHZlcmlmeSBhY3Rpb24gaXMgbW9kaWZpZWQKK2cpIFNlbmQgb2ZwX2Zsb3dfc3RhdHMgcmVxdWVzdCwgdmVyaWZ5IGNvdW50ZXJzIGFyZSBwcmVzZXJ2ZWQuCisKKworCisKKzExLiBEZWxldGUgbm9uIGV4aXN0aW5nIGZsb3cgCisKK1Rlc3QgRGVzY3JpcHRpb246IFJlcXVlc3QgZGVsZXRpb24gb2Ygbm9uLWV4aXN0aW5nIGZsb3cKKworVGl0bGU6IERlbGV0ZU5vbmV4aXN0aW5nRmxvdworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1BvcnRzOiAxKDEgY29udHJvbCBwbGFuZSkKK0luaXRpYWwgU3RhdGU6IENvbm5lY3Rpb24gc2V0dXAsIENsZWFyIFN3aXRjaCBTdGF0ZQorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgSXNzdWUgYSBkZWxldGUgY29tbWFuZCwgd2l0aCBubyBmbG93cyBpbnNlcnRlZAorYikgTWFrZSBzdXJlIG5vIGVycm9yIGlzIGdlbmVyYXRlZCBvbiB0aGUgY29udHJvbCBwbGFuZQorCisKKworMTIuIERlbGV0ZSBmbG93cyB3aXRoIGFuZCB3aXRob3V0IHJlbW92ZWQgbWVzc2FnZQorCitUZXN0IERlc2NyaXB0aW9uOiBDaGVjayBkZWxldGlvbiBvZiBmbG93cyBoYXBwZW5zIGFuZCBnZW5lcmF0ZXMgbWVzc2FnZXMgYXMgY29uZmlndXJlZC4gaS5lLiBpZiCRU2VuZCBGbG93IHJlbW92ZWQgbWVzc2FnZZJGbGFnIAorCSAgICAgICAgICBpcyBzZXQgaW4gdGhlIGZsb3cgZW50cnksIHRoZSBmbG93IGRlbGV0aW9uIG9mIHRoYXQgcmVzcGVjdGl2ZSBmbG93IHNob3VsZCBnZW5lcmF0ZSB0aGUgZmxvdyByZW1vdmVkIG1lc3NhZ2UsIAorCQkgIHZpY2UgdmVyc2EgYWxzbyBleGlzdHMgCisKK1Rlc3QgVGl0bGU6IFNlbmRGbG93UmVtCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorUG9ydHM6IDMgKDEgY29udHJvbCBwbGFuZSwgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBDb25uZWN0aW9uIHNldHVwLCBEZWZhdWx0IChjbGVhciBzd2l0Y2ggc3RhdGUpCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0IE5vdGVzOgorCithKSBHZW5lcmF0ZSBhIGZsb3cgRiB3aXRob3V0IE9GUEZGX1NFTkRfRkxPV19SRU0gZmxhZyBzZXQKK2IpIElzc3VlIGEgZGVsZXRlIGNvbW1hbmQgT0ZQRkNfREVMRVRFCitjKSBWZXJpZnkgdGhhdCBPRlBUX0ZMT1dfUkVNT1ZFRCBtZXNzYWdlIGlzIG5vdCBnZW5lcmF0ZWQuCitjKSBHZW5lcmF0ZSBhIGZsb3cgRpIgd2l0aCBPRlBGRl9TRU5EX0ZMT1dfUkVNIGZsYWcgc2V0CitkKSBJc3N1ZSBhIGRlbGV0ZSBjb21tYW5kIE9GUEZDX0RFTEVURQorZSkgVmVyaWZ5IHRoYXQgT0ZQVF9GTE9XX1JFTU9WRUQgbWVzc2FnZSBpcyBnZW5lcmF0ZWQKKworCisKKzEzLiBEZWxldGUgZW1lcmdlbmN5IGZsb3cgCisKK1Rlc3QgRGVzY3JpcHRpb246IERlbGV0ZSBlbWVyZ2VuY3kgZmxvdyBhbmQgdmVyaWZ5IG5vIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLkFuIGVtZXJnZW5jeSBmbG93IGRlbGV0aW9uIHdpbGwgbm90IGdlbmVyYXRlIAorCQkgIGZsb3ctcmVtb3ZlZCBtZXNzYWdlcyBldmVuIGlmIJFTZW5kIEZsb3cgcmVtb3ZlZCBtZXNzYWdlkiBmbGFnIHdhcyBzZXQgZHVyaW5nIHRoZSBlbWVyZ2VuY3kgZmxvdyBlbnRyeS4KKwkJICAKKworVGl0bGU6IERlbGV0ZUVtZXJGbG93CitUZXN0IG1vZGU6IEF1dG9tYXRlZAorUG9ydHM6IDMgKDEgY29udHJvbCBwbGFuZSwgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBDb25uZWN0aW9uIHNldHVwLCBDbGVhciBTd2l0Y2ggU3RhdGUgKGRlZmF1bHQpIAorCisKK1Rlc3QtTm90ZXM6CisKK2EpIEluc2VydCBhIGZsb3cgd2l0aCBPRlBGRl9FTUVSRyBmbGFnIHNldC4KK2IpIERlbGV0ZSB0aGUgYWRkZWQgZmxvdyB3aXRoIE9GUEZGX1NFTkRfRkxPV19SRU0gZmxhZyBzZXQKK2MpIFRlc3Qgc3VjY2Vzc2Z1bCBpZiBubyBmbG93IHJlbW92ZWQgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCisKKworCisxNC4gRGVsZXRlIGFuZCB2ZXJpZnkgc3RyaWN0IGFuZCBub24tc3RyaWN0IAorCitUZXN0IERlc2NyaXB0aW9uOiBEZWxldGUgYW5kIHZlcmlmeSBzdHJpY3QgYW5kIG5vbi1zdHJpY3QgYmVoYXZpb3JzCisKK1RoaXMgdGVzdCBjb21wYXJlcyB0aGUgYmVoYXZpb3Igb2YgZGVsZXRlIHN0cmljdCBhbmQgbm9uLXN0cmljdC4KK1RpdGxlOiBTdHJpY3RWc05vbnN0cmljdAorVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1BvcnRzOiAzICgxIGNvbnRyb2wgcGxhbmUsIDIgZGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogQ29ubmVjdGlvbiBzZXR1cCwgQ2xlYXIgU3dpdGNoIFN0YXRlCisKKworVGVzdC1Ob3RlczoKKworYSkgSW5zZXJ0IEZsb3cgRiB3aXRoIGFuIGV4YWN0IG1hdGNoLiAKK2IpIElzc3VlIE5vbi1zdHJpY3QgRGVsZXRlIGNvbW1hbmQsIHZlcmlmeSBGIGdldHMgZGVsZXRlZC4gCitjKSBJbnNlcnQgRiB3aXRoIGFuIGV4YWN0IE1hdGNoIAorZCkgSXNzdWUgU3RyaWN0IERlbGV0ZSBDb21tYW5kLCB2ZXJpZnkgRiBnZXRzIGRlbGV0ZWQuCitlKSBJbnNlcnQgRmxvdyBUIHdpdGggbWF0Y2ggb24gYWxsLCBleGNlcHQgb25lIHdpbGRjYXJkZWQgKHNheSBzcmMgYWRkcmVzcykuICAKK2YpIEluc2VydCBhbm90aGVyIGZsb3cgVCcgd2l0aCBtYXRjaCBvbiBpbmdyZXNzX3BvcnQsIHdpbGRjYXJkZWQgcmVzdC4gIAorZykgSXNzdWUgTm9uLXN0cmljdCBEZWxldGUgKCBtYXRjaCBvbiBpbmdyZXNzX3BvcnQpLiBWZXJpZnkgVCtUJyBnZXRzIGRlbGV0ZWQuIAoraCkgSW5zZXJ0IFQgYW5kIFQnIGFnYWluLiBJc3N1ZSBTdHJpY3QgRGVsZXRlIChtYXRjaCBvbiBpbmdyZXNzIHBvcnQpLCB2ZXJpZnkgb25seSBUJyBnZXRzIGRlbGV0ZWQKK2kpIEluc2VydCBULCBhZGQgUHJpb3JpdHkgUCAoc2F5IDEwMCkgCitqKSBJbnNlcnQgVCcgYWRkIHByaW9yaXR5ICgyMDApLiAKK2spIEluc2VydCBUJyBhZ2FpbiBhZGQgcHJpb3JpdHkgMzAwIC0tPiBUlAorbCkgSXNzdWUgTm9uLVN0cmljdCBEZWxldGUgKG1hdGNoIG9uIGluZ3Jlc3MgcG9ydCkuIFZlcmlmeSBUK1SSK1SSkiBnZXRzIGRlbGV0ZWQuIAorbSkgSW5zZXJ0IFQsIFSSLCBUkpIgYWdhaW4sIElzc3VlIFN0cmljdCBEZWxldGUgKG1hdGNoIG9uIGluZ3Jlc3NfcG9ydCkgd2l0aCBwcmlvcml0eSA9IDIwMC4gVmVyaWZ5IG9ubHkgVJIgZ2V0cyBkZWxldGVkCisKKworCisxNS4gRGVsZXRlIGZsb3dzIHdpdGggY29uc3RyYWludCBvdXRfcG9ydAorCitUZXN0IERlc2NyaXB0aW9uOiBEZWxldGUgZmxvd3MgZmlsdGVyZWQgYnkgYWN0aW9uIG91dHB1dC5ERUxFVEUgYW5kIERFTEVURSBTVFJJQ1QgY29tbWFuZHMgY2FuIGJlIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgb3V0cHV0IHBvcnQuCisJCSAgSWYgdGhlIG91dF9wb3J0IGZpZWxkIGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiBPRlBQX05PTkUsIGl0IGludHJvZHVjZXMgYSBjb25zdHJhaW50IHdoZW4gbWF0Y2hpbmcuIAorCQkgIFRoaXMgY29uc3RyYWludCBpcyB0aGF0IHRoZSBydWxlIG11c3QgY29udGFpbiBhbiBvdXRwdXQgYWN0aW9uIGRpcmVjdGVkIGF0IHRoYXQgcG9ydC4KKworVGl0bGU6IE91dHBvcnQxCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorUG9ydHM6IDMgKDEgY29udHJvbCBwbGFuZSwgMiBEYXRhcGxhbmVzKQorSW5pdGlhbCBTdGF0ZTogQ29ubmVjdGlvbiBzZXR1cCwgQ2xlYXIgU3dpdGNoIFN0YXRlCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworCitUZXN0LU5vdGVzOgorCithKSBJbnNlcnQgYSBmbG93IEYgIHdpdGggb3V0cHV0IGFjdGlvbiA9IHBvcnQgeCAKK2IpIFNlbmQgYSBkZWxldGUgY29tbWFuZCBtYXRjaGluZyBmbG93IEYgLGJ1dCAgb3V0X3BvcnQgPXBvcnQgeQorYykgU2VuZCBhIHRhYmxlX3N0YXRzIHJlcXVlc3QgLCB2ZXJpZnkgbm8gZmxvdyBnZXRzIGRlbGV0ZWQgaS5lLiBhY3RpdmVfY291bnQ9MQorZCkgU2VuZCBhIGRlbGV0ZSBjb21tYW5kIG1hdGNoaW5nIGZsb3cgRiAsb3V0cG9ydCA9IHBvcnQgeAorZSkgU2VuZCBhIHRhYmxlX3N0YXRzIHJlcXVlc3QsIHZlcmlmeSBmbG93IEYgZ2V0cyBkZWxldGVkLgorCisKKworMTYuIEFkZCwgbW9kaWZ5IGZsb3dzIHdpdGggY29uc3RyYWludCBvdXRwdXQKKworVGVzdCBEZXNjcmlwdGlvbjogQWRkLCBtb2RpZnkgZmxvd3Mgd2l0aCBvdXRwb3J0IHNldC4gVGhpcyBmaWVsZCBpcyBpZ25vcmVkIGJ5IEFERCwgTU9ESUZZLCBhbmQgTU9ESUZZIFNUUklDVCBtZXNzYWdlcy4KKworVGl0bGU6IE91dHBvcnQyCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorUG9ydHM6IDQgKDEgY29udHJvbCBwbGFuZSwgMyBEYXRhIHBsYW5lcykKK0luaXRpYWwgU3RhdGU6IENvbm5lY3Rpb24gc2V0dXAsIENsZWFyIFN3aXRjaCBTdGF0ZQorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKK1Rlc3QtTm90ZXM6CisKK2EpIEluc2VydCBhIGZsb3cgRiB3aXRoIGFjdGlvbiBBIChvdXRwdXQgLS0+IHBvcnQgeCkgLCBidXQgb3V0X3BvcnQgZmllbGQgaW4gdGhlIGZsb3cgbW9kIHNldCBhcyBwb3J0IHkKK2IpIFNlbmQgVGFibGVfU3RhdHNfUmVxdWVzdCwgVmVyaWZ5IEZsb3cgZ2V0cyBpbnNlcnRlZC4gKCBGbG93IGFkZCBpZ25vcmVzIG91dF9wb3J0IGZpZWxkKQorYykgTW9kaWZ5IHRoZSBhY3Rpb24gaW4gZmxvdyBGICwgYWN0aW9uIEGSICggb3V0cHV0IC0tPnBvcnQgeiApLCBidXQgb3V0X3BvcnQgZmllbGQgaW4gdGhlIGZsb3cgbW9kIHNldCBhcyBwb3J0IHkKK2QpIFNlbmQgdGVzdCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgRiAKK2UpIFZlcmlmeSBwYWNrZXQgaW1wbGVtZW50cyBhY3Rpb24gQZIgKGZsb3cgbW9kaWZ5IGlnbm9yZXMgb3V0X3BvcnQgZmllbGQpCisKKworCisxNy4gVmVyaWZ5IHRoYXQgaWRsZSB0aW1lb3V0IGlzIGltcGxlbWVudGVkCisKK1Rlc3QgRGVzY3JpcHRpb246IFZlcmlmeSB0aGF0IGlkbGUgdGltZW91dCBpcyBpbXBsZW1lbnRlZAorCitUaXRsZTogSWRsZVRpbWVvdXQKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitQb3J0czogMyAoMSBjb250cm9sIHBsYW5lLCAyIERhdGFwbGFuZXMpCitJbml0aWFsIFN0YXRlOiBDb25uZWN0aW9uIHNldHVwLCBDbGVhciBTd2l0Y2ggU3RhdGUKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QtTm90ZXM6CisKK2EpIEFkZCBhIGZsb3cgd2l0aCBpZGxlIHRpbWVvdXQgc2V0IGFuZCB3aXRoIE9GUFBfU0VORF9GTE9XX1JFTSBiaXQgc2V0CitiKSBWZXJpZnkgZmxvdyByZW1vdmVkIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCitjKSBWZXJpZnkgZmxvdyByZW1vdmVkIHJlYXNvbiB3YXMgaWRsZV90aW1lb3V0CitkKSBWZXJpZnkgdGhlIGR1cmF0aW9uX3NlYyBmaWVsZCBpcyAxIHNlYyAKKworCisKKzE4LiBWZXJpZnkgdGhhdCBoYXJkIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQKKworVGVzdCBEZXNjcmlwdGlvbjogVmVyaWZ5IHRoYXQgaGFyZCB0aW1lb3V0IGlzIGltcGxlbWVudGVkCisKK1RpdGxlOiBIYXJkVGltZW91dAorVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1BvcnRzOiAzICgxIGNvbnRyb2wgcGxhbmUsIDIgRGF0YXBsYW5lcykKK0luaXRpYWwgU3RhdGU6IENvbm5lY3Rpb24gc2V0dXAsIENsZWFyIFN3aXRjaCBTdGF0ZSAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QtTm90ZXM6CisKK2EpIEFkZCBhIGZsb3cgd2l0aCBoYXJkIHRpbWVvdXQgPTEgc2V0IGFuZCB3aXRoIE9GUFBfU0VORF9GTE9XX1JFTSBiaXQgc2V0CitiKSBWZXJpZnkgZmxvdyByZW1vdmVkIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCitjKSBWZXJpZnkgZmxvdyByZW1vdmVkIHJlYXNvbiB3YXMgaGFyZF90aW1lb3V0CitkKSBWZXJpZnkgdGhlIGR1cmF0aW9uX3NlYyBmaWVsZCBpcyAxIHNlYyAKKworCisKKzE5LiBWZXJpZnkgdGhhdCBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkIGFzIGV4cGVjdGVkCisKK1Rlc3QgRGVzY3JpcHRpb246IFZlcmlmeSB0aGF0IEZsb3cgcmVtb3ZlZCBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkIGFzIGV4cGVjdGVkCisJICAgICAgICAgIC8qIFNpbmNlIJNmbG93IHJlbW92ZWQgbWVzc2FnZXMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gZmxhZyBpcyBzZXSUIGlzIGFscmVhZHkgdGVzdGVkIGluIHRoZSBhYm92ZSB0ZXN0cyAKKyAgICAgICAgICAgICAgICAgIFNvIGhlcmUsIHdlIHRlc3QgdGhlIHZpY2UtdmVyc2EgY29uZGl0aW9uLiovCisKK1RpdGxlOiBGbG93VGltZW91dAorVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1BvcnRzOiAzICgxY29udHJvbCBwbGFuZSwgMWRhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IENvbm5lY3Rpb24gc2V0dXAsIENsZWFyIFN3aXRjaCBTdGF0ZSAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisKK1Rlc3QtTm90ZXM6CisKK2EpICBHZW5lcmF0ZSBhbmQgaW5zdGFsbCBhIGZsb3cgd2l0aCBpZGxlX3RpbWVvdXQgPSAxIHNldCBubyBPRlBGRl9TRU5EX0ZMT1dfUkVNIGZsYWcgc2V0LgorYikgIFZlcmlmeSBubyBmbG93IHJlbW92ZWQgbWVzc2FnZSBpcyByZWNlaXZlZC4KK2MpICBTZW5kIHRhYmxlX3N0YXRzX3JlcXVlc3QgbWVzc2FnZSBhbmQgdmVyaWZ5IGFjdGl2ZV9jb3VudD0wIAorCisKKworCisKKyoqKiAgIEFjdGlvbnMgICAqKioKKworCisKKzEuIE5vIEFjdGlvbiBkcm9wcyBwYWNrZXQgCisKK1Rlc3QgRGVzY3JpcHRpb246IElmIG5vIGZvcndhcmQgYWN0aW9ucyBhcmUgcHJlc2VudCwgdGhlIHBhY2tldCBpcyBkcm9wcGVkLiAKKwkJCitSZXF1aXJlZCBBY3Rpb246IERyb3AuIAorQSBmbG93LWVudHJ5IHdpdGggbm8gc3BlY2lmaWVkIGFjdGlvbiBpbmRpY2F0ZXMgdGhhdCBhbGwgbWF0Y2hpbmcgcGFja2V0cyBzaG91bGQgYmUgZHJvcHBlZC4gCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogIE5vQWN0aW9uCitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIDIgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBzZXR1cAorVGVzdC1GaWVsZDogTWFuZGF0b3J5CisKKworVGVzdCBOb3RlczoKKworYSkgU2VuZCBGbG93IG1vZCBtZXNzYWdlIHdpdGhvdXQgYW55IGFjdGlvbiBzcGVjaWZpZWQKK2IpIFNlbmQgTiBwYWNrZXRzIG1hdGNoaW5nIHRoZSBmbG93IAorYykgVmVyaWZ5IHBhY2tldHMgYXJlIG5vdCByZWNlaXZlZCBvbiBhbnkgb2YgdGhlIGRhdGFwbGFuZSBwb3J0cyAKK2QpIFZlcmlmeSBwYWNrZXRzIGFyZSBub3QgZXZlbiBzZW50IHRvIHRoZSBjb250cm9sbGVyCisKKworCisyLiAgR2V0IHN1cHBvcnRlZCBhY3Rpb25zIGZyb20gc3dpdGNoCisKK1Rlc3QgRGVzY3JpcHRpb246IEdldCB0aGUgc3VwcG9ydGVkIGFjdGlvbnMgZnJvbSBzd2l0Y2ggYW5kIG1ha2Ugc2FuaXR5IGNoZWNrcy4KKwkJICAvKldoZW4gY29ubmVjdGluZyB0byB0aGUgY29udHJvbGxlciwgYSBzd2l0Y2ggaW5kaWNhdGUgd2hpY2ggb2YgdGhlIJNPcHRpb25hbCBBY3Rpb25zlCBpdCBzdXBwb3J0cyovCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgQW5ub3VuY2VtZW50CitQb3J0czogMSAoQ29udHJvbCBQbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorICAgICAgIAorCitUZXN0IE5vdGVzOiAKKworYSkgU2VuZCBmZWF0dXJlc19yZXF1ZXN0IC4KK2IpIFZlcmlmeSByZXNwb25zZSBpcyBPRlBUX0ZFQVRVUkVTX1JFUExZCitjKSBWZXJpZnkgcmVwbHkgaGFzIHN1cHBvcnRlZCBhY3Rpb24gbGlzdCBzcGVjaWZpZWQKKworCisKKzMuIEZvcndhcmQgQWxsCisKK1Rlc3QgRGVzY3JpcHRpb246IFBhY2tldCBpcyBzZW50IHRvIGFsbCBkYXRhcGxhbmUgcG9ydHMgZXhjZXB0IGluZ3Jlc3MgcG9ydCB3aGVuIG91dHB1dCBhY3Rpb24ucG9ydCA9IE9GUFBfQUxMCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgRm9yd2FyZEFsbAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zdGFsbCBhIGZsb3cgd2l0aCBvdXRwdXQgYWN0aW9uLnBvcnQgPSBPRlBQX0FMTC4KK2IpIFZlcmlmeSBwYWNrZXRzIGFyZSBmb3J3YXJkZWQgdG8gYWxsIHBvcnRzIGV4Y2VwdCBpbmdyZXNzIHBvcnQuCisKKworCis0LiBGb3J3YXJkIENvbnRyb2xsZXIgCisKK1Rlc3QgRGVzY3JpcHRpb246IFBhY2tldCBpcyBzZW50IHRvIGNvbnRyb2xsZXIgb3V0cHV0LnBvcnQgPSBPRlBQX0NPTlRST0xMRVIKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBGb3J3YXJkQ29udHJvbGxlcgorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiBvdXRwdXQgcG9ydCA9IE9GUFBfQ09OVFJPTExFUgorYikgU2VuZCBwYWNrZXRzIG1hdGNoaW5nIHRoZSBmbG93CitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIG9uIHRoZSBjb250cm9sIHBsYW5lIGFzIGEgcGFja2V0X2luIG1lc3NhZ2UKKworCisKKzUuIEZvcndhcmQgTG9jYWwgKFRCRCCWIFZlcmlmaWNhdGlvbiBvZiBwYWNrZXQgYmVpbmcgcmVjZWl2ZWQgYXQgbG9jYWwgbmV0d29ya2luZyBzdGFjaykKKworVGVzdCBEZXNjcmlwdGlvbjogUGFja2V0IGlzIHNlbnQgdG8gc3dpdGNoknMgbG9jYWwgbmV0d29ya2luZyBzdGFjayBpZiBvdXRwdXQucG9ydCA9IE9GUFBfTE9DQUwKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBGb3J3YXJkTG9jYWwKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworICAgICAgIAorVGVzdCBOb3RlczogCisKK2EpIEluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gb3V0cHV0IHBvcnQgPSBPRlBQX0xPQ0FMCitiKSBTZW5kIHBhY2tldHMgbWF0Y2hpbmcgdGhlIGZsb3cKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgaW4gdGhlIHN3aXRjaJJzIGxvY2FsIG5ldHdvcmtpbmcgc3RhY2suCisKKworCis2LiBGb3J3YXJkIFRhYmxlCisKK1Rlc3QgRGVzY3JpcHRpb246IFBlcmZvcm0gYWN0aW9ucyBpbiBmbG93IHRhYmxlLiBPbmx5IGZvciBwYWNrZXQtb3V0IG1lc3NhZ2VzLgorCQkgIC8qSWYgdGhlIG91dHB1dCBhY3Rpb24ucG9ydCBpbiB0aGUgcGFja2V0b3V0IG1lc3NhZ2UgPSBPRlAuVEFCTEUsIHRoZW4gdGhlIHBhY2tldCBpbXBsZW1lbnRzIHRoZSBhY3Rpb24gCisJCSAgc3BlY2lmaWVkIGluIHRoZSBtYXRjaGluZyBmbG93IG9mIHRoZSBGTE9XLVRBQkxFKi8KKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBGb3J3YXJkVGFibGUKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBNYW5kYXRvcnkKKworVGVzdCBOb3RlczogCisKK2EpIEluc2VydCBhIGZsb3cgRiB3aXRoIGFjdGlvbiBvdXRwdXQucG9ydCA9IGVncmVzc19wb3J0CitiKSBTZW5kIGEgT0ZQVF9QQUNLRVRfT1VUIG1lc3NhZ2Ugd2l0aCBvdXQgcG9ydD1PRlBQX1RBQkxFIG1hdGNoaW5nIGZsb3cgRiAKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgb24gZWdyZXNzX3BvcnQgKGkuZSBwYWNrZXRvdXQgbWVzc2FnZSBpbXBsZW1lbnRlZCB0aGUgYWN0aW9uIHNwZWNpZmllZCBpbiB0aGUgbWF0Y2hpbmcgZmxvdyBvZiB0aGUgVGFibGUpCisKKworCis3LiBGb3J3YXJkIEluIFBvcnQKKworVGVzdCBEZXNjcmlwdGlvbjogUGFja2V0IGlzIHNlbnQgdG8gaW5wdXQgcG9ydCBpZiBvdXRwdXQucG9ydCA9IE9GUFBfSU5QT1JUCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgRm9yd2FyZElucG9ydAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE1hbmRhdG9yeQorCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiBvdXRwdXQgcG9ydCA9IE9GUFBfSU5QT1JUCitiKSBTZW5kIHBhY2tldHMgbWF0Y2hpbmcgdGhlIGZsb3cKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgb24gYWxsIGRhdGFwbGFuZSBwb3J0cyBleGNlcHQgZm9yIGlucHV0IHBvcnQKKworCisKKzguIEZvcndhcmQgRmxvb2QKKworVGVzdCBEZXNjcmlwdGlvbjpGbG9vZCB0aGUgcGFja2V0IGFsb25nIHRoZSBtaW5pbXVtIHNwYW5uaW5nIHRyZWUsIG5vdCBpbmNsdWRpbmcgdGhlIGluY29taW5nIGludGVyZmFjZS4gCisJCSBQYWNrZXQgaXMgc2VudCBhbGwgdGhlIGRhdGFwbGFuZSBwb3J0cyBleGNlcHQgdGhlIGlucHV0IHBvcnQgaWYgb3V0cHV0LnBvcnQgPSBPRlBQX0ZMT09ECisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgRm9yd2FyZF9GbG9vZAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE9wdGlvbmFsCisKK1Rlc3QgTm90ZXM6IAorCithKSBJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uIG91dHB1dCBwb3J0ID0gT0ZQUF9GTE9PRAorYikgU2VuZCBwYWNrZXRzIG1hdGNoaW5nIHRoZSBmbG93CitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIG9uIGFsbCBkYXRhcGxhbmUgcG9ydHMgZXhjZXB0IGZvciBpbnB1dCBwb3J0CisKKworCis5LiBNdWx0aXBsZSBQb3J0cyAtLSBUQkQKKworCisKKworMTAuIEZvcndhcmQgRW5xdWV1ZSAtLS0gVEJECisKKworCisKKzExLiBTZXQgVkxBTiBJZAorCitUZXN0IERlc2NyaXB0aW9uOiBBdHRhY2ggVkxBTiBJRCB0byB1bnRhZ2dlZCBwYWNrZXQuCisgICAgICAgICAgICAgICAgICBJZiBubyBWTEFOIGlzIHByZXNlbnQsIGEgbmV3IGhlYWRlciBpcyBhZGRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgVkxBTiBJRCBhbmQgcHJpb3JpdHkgb2YgemVyby4KKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBBZGRWbGFuSWQKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9WTEFOX1ZJRCAsIHZsYW5fdmlkID0geCAKK2IpIFNlbmQgcGFja2V0IChsZW5ndGggPSAxMDAgYnl0ZXMpIG1hdGNoaW5nIHRoZSBmbG93CitiKSAgIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgaGFzIHZsYW4gaWQgYWRkZWQgdG8gaXQuIChJLmUgbGVuZ3RoIG9mIHBhY2tldCB3aXRoIHZpZCBpcyAxMDQgYnl0ZXMsIGRsX3ZsYW5fZW5hYmxlID0gVHJ1ZSwgZGxfdmxhbj0geCwgZGxfdmxhbl9wY3A9MCkgIAorICAgCisKKworMTIuIE1vZGlmeSBWTEFOIElkCisKK1Rlc3QgRGVzY3JpcHRpb246IE1vZGlmaWVzIFZsYW4gVGFnIGZvciBhIHRhZ2dlZCBwYWNrZXQKKwkJICBJZiBhIFZMQU4gaGVhZGVyIGFscmVhZHkgZXhpc3RzLCB0aGUgVkxBTiBJRCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBNb2RpZnlWbGFuSWQKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisKK1Rlc3QgTm90ZXM6IAorYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9WTEFOX1ZJRCAsIHZsYW5fdmlkID0geCAKK2IpICAgU2VuZCBwYWNrZXQgKGxlbmd0aCA9IDEwMCBieXRlcykgbWF0Y2hpbmcgdGhlIGZsb3cKK2MpICAgVmVyaWZ5IHBhY2tldCByZWNlaXZlZCBoYXMgdmxhbiBpZCByZXdyaXR0ZW4uIChJLmUgbGVuZ3RoIG9mIDEwNCBieXRlcywgZGxfdmxhbl9lbmFibGUgPSBUcnVlLCBkbF92bGFuPXgpICAKKworCisKKzEzLiBBZGQgVkxBTiBQcmlvcml0eSB0byBhbiB1bnRhZ2dlZCBwYWNrZXQKKworVGVzdCBEZXNjcmlwdGlvbjogQXR0YWNoIFZMQU4gcHJpb3JpdHkgdG8gYW4gdW50YWdnZWQgcGFja2V0LgorCQkgIFNpbmNlLCBubyBWTEFOIElEIGlzIHByZXNlbnQ7IGEgbmV3IGhlYWRlciBpcyBhZGRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJpb3JpdHkgYW5kIGEgVkxBTiBJRCBvZiB6ZXJvLlwKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBWbGFuUHJpbzEKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9WTEFOX1BDUCAsIGRsX3ZsYW5fcGNwID14CitiKSBTZW5kIHVudGFnZ2VkIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdyAgCitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIGhhcyB2bGFuIHByaW9yaXR5IGFkZGVkIHRvIGl0IGFsb25nIHdpdGggYSB2aWQgdmFsdWUgb2YgemVybyBhZGRlZCBieSBkZWZhdWx0ICAgKGRsX3ZsYW5fZW5hYmxlICwgZGxfdmxhbiA9IDAgLCBkbF92bGFuX3BjcCA9eCApCisKKworCisxNC4gUmV3cml0ZSBleGlzdGluZyBWTEFOIHByaW9yaXR5CisKK1Rlc3QgRGVzY3JpcHRpb246IE1vZGlmeSBWTEFOIHByaW9yaXR5IGZvciBhIHRhZ2dlZCBwYWNrZXQuCisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgVmxhblByaW8yCitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIDIgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBzZXR1cAorVGVzdC1GaWVsZDogT3B0aW9uYWwKKworICAgICAgIAorVGVzdCBOb3RlczogCisKK2EpIEluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gPSBPRlBBVF9TRVRfVkxBTl9QQ1AgLCBkbF92bGFuX3BjcCA9bmV3X3ZsYW5fcGNwCitiKSBTZW5kIHRhZ2dlZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgIChkbF92bGFuID0gb2xkX3ZsYW5faWQgLCBkbF92bGFuX3BjcCA9IG9sZF92bGFuX3BjcCkKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgaGFzIHZsYW4gaWQgYWRkZWQgdG8gaXQuIChkbF92bGFuX2VuYWJsZSAsIGRsX3ZsYW4gPSAwICwgZGxfdmxhbl9wY3AgPSBuZXdfdmxhbl9wY3ApCisKKworCisKKzE1LiBNb2RpZnkgTDIgU3JjIEFkZHJlc3MKKworVGVzdCBEZXNjcmlwdGlvbjogTW9kaWZ5IEV0aGVybmV0IFNyYyBBZGRyZXNzIG9mIGEgcGFja2V0CisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgTW9kaWZ5TDJTcmMKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9ETF9TUkMgLCBkbF9zcmMgPW5ld19kbF9zcmMKK2IpIFNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93ICAoZGxfZHN0ID0gb2xkX2RsX3NyYyApCitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIGhhcyBzcmMgYWRkcmVzcyByZXdyaXR0ZW4uIChkbF9zcmM9IG5ld19kbF9zcmMpCisKKworCisxNi4gTW9kaWZ5IEwyIERlc3RpbmF0aW9uIEFkZHJlc3MKKworVGVzdCBEZXNjcmlwdGlvbjogTW9kaWZ5IEV0aGVybmV0IERlc3RpbmF0aW9uIEFkZHJlc3Mgb2YgYSBwYWNrZXQKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBNb2RpZnlMMkRzdAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE9wdGlvbmFsCisKKyAgICAgICAKK1Rlc3QgTm90ZXM6IAorCithKSBJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uID0gT0ZQQVRfU0VUX0RMX0RTVCAsIGRsX2RzdCA9bmV3X2RsX2RzdAorYikgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgIChkbF9kc3QgPSBvbGRfZGxfc3JjICkKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgaGFzIGRlc3RpbmF0aW9uIGFkZHJlc3MgcmV3cml0dGVuLiAoZGxfc3JjPSBuZXdfZGxfc3JjKQorCisKKworMTcuIFN0cmlwIFZMQU4gaGVhZGVyIJYgKEluIG9mdGVzdCwgIG5lZWQgdG8gYWRkIGluIGNvbmZvcm1hbmNlIHRlc3Qtc3VpdGUgKQorCisKKworMTguIE1vZGlmeSBMMyBTcmMgQWRkcmVzcworCitUZXN0IERlc2NyaXB0aW9uOiBNb2RpZnkgTmV0d29yayBTcmMgQWRkcmVzcyBvZiBhIHBhY2tldAorCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogIE1vZGlmeUwzU3JjCitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIDIgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBzZXR1cAorVGVzdC1GaWVsZDogT3B0aW9uYWwKKworICAgICAgIAorVGVzdCBOb3RlczogCisKK2EpIEluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gPSBPRlBBVF9TRVRfTldfU1JDICwgbndfc3JjID1uZXdfbndfc3JjCitiKSBTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdyAgKG53X3NyYyA9IG9sZF9ud19zcmMgKQorYykgVmVyaWZ5IHBhY2tldCByZWNlaXZlZCBoYXMgbncgYWRkcmVzcyByZXdyaXR0ZW4uIChud19zcmM9IG5ld19ud19zcmMpCisKKworCisxOS4gTW9kaWZ5IEwzIERzdCBBZGRyZXNzCisKK1Rlc3QgRGVzY3JpcHRpb246IE1vZGlmeSBOZXR3b3JrIERzdCBBZGRyZXNzIG9mIGEgcGFja2V0CisKK1Rlc3QgbW9kZTogQXV0b21hdGVkCitUZXN0IFRpdGxlOiAgTW9kaWZ5TDNEc3QKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9OV19EU1QgLCBud19kc3QgPW5ld19ud19kc3QKK2IpIFNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93ICAobndfZHN0ID0gb2xkX253X2RzdCApCitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIGhhcyBudyBkZXN0aW5hdGlvbiBhZGRyZXNzIHJld3JpdHRlbi4gKG53X2RzdD0gbmV3X253X2RzdCkKKworCisKKzIwLiBNb2RpZnkgTDQgU3JjIEFkZHJlc3MKKworVGVzdCBEZXNjcmlwdGlvbjogTW9kaWZ5IFRDUCBTb3VyY2UgUG9ydCBvZiBhIHBhY2tldAorCitUZXN0IG1vZGU6IEF1dG9tYXRlZAorVGVzdCBUaXRsZTogIE1vZGlmeUw0U3JjCitQb3J0czogMyAoMSBDb250cm9sIFBsYW5lIDIgRGF0YXBsYW5lKQorSW5pdGlhbCBTdGF0ZTogRGVmYXVsdCAoQ2xlYXIgc3dpdGNoIHN0YXRlKSwgQ29ubmVjdGlvbiBzZXR1cAorVGVzdC1GaWVsZDogT3B0aW9uYWwKKworICAgICAgIAorVGVzdCBOb3RlczogCisKK2EpIEluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gPSBPRlBBVF9TRVRfVFBfU1JDICwgdGNwX3Nwb3J0ID1uZXdfdGNwX3Nwb3J0CitiKSBTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdyAgKHRjcF9zcG9ydCA9IG9sZF90Y3Bfc3BvcnQgKQorYykgVmVyaWZ5IHBhY2tldCByZWNlaXZlZCBoYXMgdGNwIHNvdXJjZSBwb3J0IHJld3JpdHRlbi4gKHRjcF9zcG9ydCA9IG5ld190Y3Bfc3BvcnQpCisKKworMjEuIE1vZGlmeSBMNCBEc3QgQWRkcmVzcworCitUZXN0IERlc2NyaXB0aW9uOiBNb2RpZnkgVENQIERlc3RpbmF0aW9uIFBvcnQgb2YgYSBwYWNrZXQKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBNb2RpZnlMNERzdAorUG9ydHM6IDMgKDEgQ29udHJvbCBQbGFuZSAyIERhdGFwbGFuZSkKK0luaXRpYWwgU3RhdGU6IERlZmF1bHQgKENsZWFyIHN3aXRjaCBzdGF0ZSksIENvbm5lY3Rpb24gc2V0dXAKK1Rlc3QtRmllbGQ6IE9wdGlvbmFsCisKKyAgICAgICAKK1Rlc3QgTm90ZXM6IAorCithKSBJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uID0gT0ZQQVRfU0VUX1RQX0RTVCAsIHRjcF9kcG9ydCA9bmV3X3RjcF9kcG9ydAorYikgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgICh0Y3BfZHBvcnQgPSBvbGRfdGNwX2Rwb3J0ICkKK2MpIFZlcmlmeSBwYWNrZXQgcmVjZWl2ZWQgaGFzIHRjcCBkZXN0aW5hdGlvbiBwb3J0IHJld3JpdHRlbi4gKHRjcF9zcG9ydCA9IG5ld190Y3Bfc3BvcnQpCisKKworCisyMi4gTW9kaWZ5IFRPUworCitUZXN0IERlc2NyaXB0aW9uOiBNb2RpZnkgTmV0d29yayBUeXBlIG9mIHNlcnZpY2UKKworVGVzdCBtb2RlOiBBdXRvbWF0ZWQKK1Rlc3QgVGl0bGU6ICBNb2RpZnlUb3MKK1BvcnRzOiAzICgxIENvbnRyb2wgUGxhbmUgMiBEYXRhcGxhbmUpCitJbml0aWFsIFN0YXRlOiBEZWZhdWx0IChDbGVhciBzd2l0Y2ggc3RhdGUpLCBDb25uZWN0aW9uIHNldHVwCitUZXN0LUZpZWxkOiBPcHRpb25hbAorCisgICAgICAgCitUZXN0IE5vdGVzOiAKKworYSkgSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiA9IE9GUEFUX1NFVF9OV19UT1MsIGlwX3RvcyA9bmV3X2lwX3RvcworYikgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgIChpcF90b3M9IG9sZF9pcF90b3MpCitjKSBWZXJpZnkgcGFja2V0IHJlY2VpdmVkIGhhcyB0Y3AgZGVzdGluYXRpb24gcG9ydCByZXdyaXR0ZW4uIChpcF90b3M9IG5ld19pcF90b3MpCisKKworCisyMy4gT3JkZXIgTm90IHBvc3NpYmxlICAtLSBUQkQKKworCisKKworMjQuIFNlcXVlbnRpYWwgZXhlY3V0aW9uICAtLSBUQkQgCisKZGlmZiAtLWdpdCBhL3Rlc3RzL0Z1bmNVdGlscy5weSBiL3Rlc3RzL0Z1bmNVdGlscy5weQppbmRleCBkMTRlZTcxLi42OTUxMjkzIDEwMDY0NAotLS0gYS90ZXN0cy9GdW5jVXRpbHMucHkKKysrIGIvdGVzdHMvRnVuY1V0aWxzLnB5CkBAIC0yMjUsNiArMjI1LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxfcGFja2V0c19yZWNlaXZlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJGbG93IGNvdW50ZXJzIGFyZSBpbmNvcnJlY3QiKQogCitkZWYgVmVyaWZ5X1BvcnRTdGF0cyhzZWxmLGluX3BvcnQscnhfZHJvcHBlZCk6CisjVmVyaWZ5IFBvcnQgY291bnRlcnMgbGlrZSByeF9kcm9wcGVkCisKKyAgICAgICAgcG9ydF9zdGF0c19yZXEgPSBtZXNzYWdlLnBvcnRfc3RhdHNfcmVxdWVzdCgpCisgICAgICAgIHBvcnRfc3RhdHNfcmVxLnBvcnRfbm8gPSBpbl9wb3J0ICAgCisgICAgICAgIHJlc3AscGt0ID0gc2VsZi5jb250cm9sbGVyLnRyYW5zYWN0KHBvcnRfc3RhdHNfcmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcCBpcyBub3QgTm9uZSwiTm8gcmVzcG9uc2UgcmVjZWl2ZWQgZm9yIHBvcnQgc3RhdHMgcmVxdWVzdCIpICAgICAgICAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AucnhfZHJvcHBlZCA9PSByeF9kcm9wcGVkLCAiUGFja2V0cyBub3QgZHJvcHBlZCIpCisKKwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVmFyaW91cyBkZWxldGUgY29tbWFuZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTI4NCwzICsyOTQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgIiwgZXhwZWN0ZWQgcG9ydCAiICsgc3RyKGVncmVzc19wb3J0KSkKICAgICBvYmouYXNzZXJ0RXF1YWwoc3RyKHBrdCksIHN0cihyY3ZfcGt0KSwKICAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNlIHBhY2tldCBkb2VzIG5vdCBtYXRjaCBzZW5kIHBhY2tldCcpCisKKworZGVmIHN3X3N1cHBvcnRlZF9hY3Rpb25zKHBhcmVudCx1c2VfY2FjaGU9RmFsc2UpOgorI1JldHVybnMgdGhlIHN3aXRjaCdzIHN1cHBvcnRlZCBhY3Rpb25zCisKKyAgICBjYWNoZV9zdXBwb3J0ZWRfYWN0aW9ucyA9IE5vbmUKKyAgICBpZiBjYWNoZV9zdXBwb3J0ZWRfYWN0aW9ucyBpcyBOb25lIG9yIG5vdCB1c2VfY2FjaGU6CisgICAgICAgIHJlcXVlc3QgPSBtZXNzYWdlLmZlYXR1cmVzX3JlcXVlc3QoKQorICAgICAgICAocmVwbHksIHBrdCkgPSBwYXJlbnQuY29udHJvbGxlci50cmFuc2FjdChyZXF1ZXN0KQorICAgICAgICBwYXJlbnQuYXNzZXJ0VHJ1ZShyZXBseSBpcyBub3QgTm9uZSwgIkRpZCBub3QgZ2V0IHJlc3BvbnNlIHRvIGZ0ciByZXEiKQorICAgICAgICBjYWNoZV9zdXBwb3J0ZWRfYWN0aW9ucyA9IHJlcGx5LmFjdGlvbnMKKyAgICByZXR1cm4gY2FjaGVfc3VwcG9ydGVkX2FjdGlvbnMKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvYWN0aW9ucy5weSBiL3Rlc3RzL2FjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxMmEwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FjdGlvbnMucHkKQEAgLTAsMCArMSw4NDcgQEAKKworIiIiVGhlc2UgdGVzdHMgZmFsbCB1bmRlciBDb25mb3JtYW5jZSBUZXN0LVN1aXRlIChPRi1TV0lUQ0gtMS4wLjAgVGVzdENhc2VzKS4KKyAgICBSZWZlciBEb2N1bWVudGF0aW9uIC0tIERldGFpbGVkIHRlc3RpbmcgbWV0aG9kb2xvZ3kgCisgICAgPFNvbWUgb2YgdGVzdC1jYXNlcyBhcmUgZGlyZWN0bHkgdGFrZW4gZnJvbSBvZnRlc3Q+ICIiIgorCisiVGVzdCBTdWl0ZSA2ICAtLS0+IEFjdGlvbnMgIgorCisKK2ltcG9ydCBsb2dnaW5nCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHJhbmRvbQorCitpbXBvcnQgb2Z0ZXN0LmNvbnRyb2xsZXIgYXMgY29udHJvbGxlcgoraW1wb3J0IG9mdGVzdC5jc3RydWN0IGFzIG9mcAoraW1wb3J0IG9mdGVzdC5tZXNzYWdlIGFzIG1lc3NhZ2UKK2ltcG9ydCBvZnRlc3QuZGF0YXBsYW5lIGFzIGRhdGFwbGFuZQoraW1wb3J0IG9mdGVzdC5hY3Rpb24gYXMgYWN0aW9uCitpbXBvcnQgb2Z0ZXN0LnBhcnNlIGFzIHBhcnNlCitpbXBvcnQgYmFzaWMKK2ltcG9ydCB0aW1lCisKK2Zyb20gdGVzdHV0aWxzIGltcG9ydCAqCitmcm9tIHRpbWUgaW1wb3J0IHNsZWVwCitmcm9tIEZ1bmNVdGlscyBpbXBvcnQgKgorCithY19wb3J0X21hcCA9IE5vbmUKK2FjX2xvZ2dlciA9IE5vbmUKK2FjX2NvbmZpZyA9IE5vbmUKK29mX3BvcnRzID0gTm9uZQorCitkZWYgdGVzdF9zZXRfaW5pdChjb25maWcpOgorICAgIGJhc2ljLnRlc3Rfc2V0X2luaXQoY29uZmlnKQorICAgIAorICAgIGdsb2JhbCBhY19wb3J0X21hcAorICAgIGdsb2JhbCBhY19sb2dnZXIKKyAgICBnbG9iYWwgYWNfY29uZmlnCisgICAgZ2xvYmFsIG9mX3BvcnRzCisKKyAgICBhY19sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiUnVubmluZyBBY3Rpb25zIHRlc3Qtc3VpdGUiKQorICAgIGFjX2xvZ2dlci5pbmZvKCJJbml0aWFsaXppbmcgdGVzdCBzZXQiKQorICAgIGFjX3BvcnRfbWFwID0gY29uZmlnWyJwb3J0X21hcCJdCisgICAgYWNfY29uZmlnID0gY29uZmlnCisgICAgCisgICAgb2ZfcG9ydHMgPSBhY19wb3J0X21hcC5rZXlzKCkKKyAgICBvZl9wb3J0cy5zb3J0KCkKKworICAgCisKK2NsYXNzIE5vQWN0aW9uKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CisKKyAgICAiIiJOb0FjdGlvbkRyb3AgOiBubyBhY3Rpb24gYWRkZWQgdG8gZmxvdyAsIGRyb3BzIHRoZSBwYWNrZXQuIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE5vX0FjdGlvbiB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKyAgICAgICAgCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnN0YWxsIGEgZmxvdyB3aXRob3V0IGFjdGlvbiIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldHMgbWF0Y2hpbmcgdGhhdCBmbG93IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBzd2l0Y2ggdG8gZHJvcCBhbGwgcGFja2V0cyIpCisKKyAgICAgICAgIyBJbnNlcnQgYSBmbG93IHdpbGRjYXJkIGFsbCB3aXRob3V0IGFueSBhY3Rpb24gCisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KCkKKyAgICAgICAgbWF0Y2ggPSBwYXJzZS5wYWNrZXRfdG9fZmxvd19tYXRjaChwa3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRjaCBpcyBub3QgTm9uZSwgIkNvdWxkIG5vdCBnZW5lcmF0ZSBmbG93IG1hdGNoIGZyb20gcGt0IikKKyAgICAgICAgbWF0Y2gud2lsZGNhcmRzPW9mcC5PRlBGV19BTEwKKyAgICAgICAgbWF0Y2guaW5fcG9ydCA9IG9mX3BvcnRzWzBdCisgICAgICAgIAorICAgICAgICBtc2cgPSBtZXNzYWdlLmZsb3dfbW9kKCkKKyAgICAgICAgbXNnLm91dF9wb3J0ID0gb2ZwLk9GUFBfTk9ORQorICAgICAgICBtc2cuY29tbWFuZCA9IG9mcC5PRlBGQ19BREQKKyAgICAgICAgbXNnLmJ1ZmZlcl9pZCA9IDB4ZmZmZmZmZmYKKyAgICAgICAgbXNnLm1hdGNoID0gbWF0Y2gKKyAgICAgICAgcnYgPSBzZWxmLmNvbnRyb2xsZXIubWVzc2FnZV9zZW5kKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ2ICE9IC0xLCAiRXJyb3IgaW5zdGFsbGluZyBmbG93IG1vZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9fYmFycmllcihzZWxmLmNvbnRyb2xsZXIpLCAwLCAiQmFycmllciBmYWlsZWQiKQorCisgICAgICAgICNTZW5kaW5nIE4gcGFja2V0cyBtYXRjaGluZyB0aGUgZmxvdyBpbnNlcnRlZAorICAgICAgICBmb3IgcGt0X2NudCBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIHNlbGYuZGF0YXBsYW5lLnNlbmQob2ZfcG9ydHNbMF0sc3RyKHBrdCkpCisgICAgICAgIAorICAgICAgICAjVmVyaWZ5IHBhY2tldHMgbm90IHJlY2lldmVkIG9uIGFueSBvZiB0aGUgZGF0YXBsYW5lIHBvcnRzIAorICAgICAgICAocmN2X3BvcnQsIHJjdl9wa3QsIHBrdF90aW1lKSA9IHNlbGYuZGF0YXBsYW5lLnBvbGwodGltZW91dD0xLGV4cF9wa3Q9cGt0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmN2X3BrdCBpcyBOb25lLAorICAgICAgICAgICAgICAgICJQYWNrZXQgcmVjZWl2ZWQgb24gcG9ydCAiICsgc3RyKHJjdl9wb3J0KSkKKworICAgICAgICAjVmVyaWZ5IHBhY2tldHMgbm90IHNlbnQgb24gY29udHJvbCBwbGFuZSBlaXRoZXIKKyAgICAgICAgKHJlc3BvbnNlLCByYXcpID0gc2VsZi5jb250cm9sbGVyLnBvbGwob2ZwLk9GUFRfUEFDS0VUX0lOLCB0aW1lb3V0PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwb25zZSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1BhY2tldHMgbm90IHJlY2VpdmVkIG9uIGNvbnRyb2wgcGxhbmUnKQorCisKK2NsYXNzIEFubm91bmNlbWVudChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIkFubm91bmNlbWVudCA6IEdldCBhbGwgc3VwcG9ydGVkIGFjdGlvbnMgYnkgdGhlIHN3aXRjaC4KKyAgICBTZW5kIE9GUFRfRkVBVFVSRVNfUkVRVUVTVCB0byBnZXQgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHN3LiIiIgorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgQW5ub3VuY2VtZW50IHRlc3QiKQorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kaW5nIEZlYXR1cmVzX1JlcXVlc3QiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiRXhwZWN0aW5nIEZlYXR1cmVzIFJlcGx5IHdpdGggc3VwcG9ydGVkIGFjdGlvbnMiKQorCisgICAgICAgICMgU2VuZGluZyBGZWF0dXJlc19SZXF1ZXN0CisgICAgICAgIHJlcXVlc3QgPSBtZXNzYWdlLmZlYXR1cmVzX3JlcXVlc3QoKQorICAgICAgICAocmVwbHksIHBrdCkgPSBzZWxmLmNvbnRyb2xsZXIudHJhbnNhY3QocmVxdWVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGx5IGlzIG5vdCBOb25lLCAiRmFpbGVkIHRvIGdldCBhbnkgcmVwbHkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcGx5LmhlYWRlci50eXBlLCBvZnAuT0ZQVF9GRUFUVVJFU19SRVBMWSwnUmVzcG9uc2UgaXMgbm90IEZlYXR1cmVzX3JlcGx5JykKKyAgICAgICAgCisgICAgICAgIHN1cHBvcnRlZF9hY3Rpb25zID1bXQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfT1VUUFVUKToKKyAgICAgICAgICAgIHN1cHBvcnRlZF9hY3Rpb25zLmFwcGVuZCgnT0ZQQVRfT1VUUFVUJykKKyAgICAgICAgaWYocmVwbHkuYWN0aW9ucyAmMTw8b2ZwLk9GUEFUX1NFVF9WTEFOX1ZJRCk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9WTEFOX1ZJRCcpCisgICAgICAgIGlmKHJlcGx5LmFjdGlvbnMgJjE8PG9mcC5PRlBBVF9TRVRfVkxBTl9QQ1ApOgorICAgICAgICAgICAgc3VwcG9ydGVkX2FjdGlvbnMuYXBwZW5kKCdPRlBBVF9TRVRfVkxBTl9QQ1AnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU1RSSVBfVkxBTik6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NUUklQX1ZMQU4nKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX0RMX1NSQyk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9ETF9TUkMnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX0RMX0RTVCk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9OV19TUkMnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX05XX0RTVCk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9OV19EU1QnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX05XX1RPUyk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9OV19UT1MnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX1RQX1NSQyk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9UUF9TUkMnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfU0VUX1RQX0RTVCk6CisgICAgICAgICAgICBzdXBwb3J0ZWRfYWN0aW9ucy5hcHBlbmQoJ09GUEFUX1NFVF9UUF9EU1QnKQorICAgICAgICBpZihyZXBseS5hY3Rpb25zICYxPDxvZnAuT0ZQQVRfVkVORE9SKToKKyAgICAgICAgICAgIHN1cHBvcnRlZF9hY3Rpb25zLmFwcGVuZCgnT0ZQQVRfVkVORE9SJykKKyAgICAgICAgaWYocmVwbHkuYWN0aW9ucyAmMTw8b2ZwLk9GUEFUX0VOUVVFVUUpOgorICAgICAgICAgICAgc3VwcG9ydGVkX2FjdGlvbnMuYXBwZW5kKCdPRlBBVF9FTlFVRVVFJykKKyAgICAgICAgCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKHN1cHBvcnRlZF9hY3Rpb25zKQorICAgICAgICAKKworY2xhc3MgRm9yd2FyZEFsbChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIkZvcndhcmRBbGwgOiBQYWNrZXQgaXMgc2VudCB0byBhbGwgZGF0YXBsYW5lIHBvcnRzCisgICAgZXhjZXB0IGluZ3Jlc3MgcG9ydCB3aGVuIG91dHB1dCBhY3Rpb24ucG9ydCA9IE9GUFBfQUxMIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBGb3J3YXJkX0FsbCB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKyAgICAgICAgCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggb3V0cHV0IGFjdGlvbiBwb3J0IE9GUFBfQUxMIikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBwYWNrZXQgb24gYWxsIGRhdGFwbGFuZSBwb3J0cyBleGNlcHQgaW5ncmVzc19wb3J0IikKKyAgICAgICAgCisgICAgICAgICNDcmVhdGUgYSBwYWNrZXQKKyAgICAgICAgcGt0ID0gc2ltcGxlX3RjcF9wYWNrZXQoKQorICAgICAgICBtYXRjaCA9IHBhcnNlLnBhY2tldF90b19mbG93X21hdGNoKHBrdCkKKyAgICAgICAgYWN0ID0gYWN0aW9uLmFjdGlvbl9vdXRwdXQoKQorCisgICAgICAgICNEZWxldGUgYWxsIGZsb3dzIAorICAgICAgICBydiA9IGRlbGV0ZV9hbGxfZmxvd3Moc2VsZi5jb250cm9sbGVyLCBhY19sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisgICAgICAgIGluZ3Jlc3NfcG9ydD1vZl9wb3J0c1swXQorICAgICAgICBtYXRjaC5pbl9wb3J0ID0gaW5ncmVzc19wb3J0CisKKyAgICAgICAgI0NyZWF0ZSBhIGZsb3cgbW9kIHdpdGggYWN0aW9uLnBvcnQgPSBPRlBQX0FMTAorICAgICAgICByZXF1ZXN0ID0gbWVzc2FnZS5mbG93X21vZCgpCisgICAgICAgIHJlcXVlc3QubWF0Y2ggPSBtYXRjaAorICAgICAgICByZXF1ZXN0Lm1hdGNoLndpbGRjYXJkcyA9IG9mcC5PRlBGV19BTEwmfm9mcC5PRlBGV19JTl9QT1JUCisgICAgICAgIGFjdC5wb3J0ID0gb2ZwLk9GUFBfQUxMCisgICAgICAgIHJlcXVlc3QuYWN0aW9ucy5hZGQoYWN0KQorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydGluZyBmbG93IikKKyAgICAgICAgcnYgPSBzZWxmLmNvbnRyb2xsZXIubWVzc2FnZV9zZW5kKHJlcXVlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydiAhPSAtMSwgIkVycm9yIGluc3RhbGxpbmcgZmxvdyBtb2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX2JhcnJpZXIoc2VsZi5jb250cm9sbGVyKSwgMCwgIkJhcnJpZXIgZmFpbGVkIikKKworICAgICAgICAjU2VuZCBQYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmRpbmcgcGFja2V0IHRvIGRwIHBvcnQgIiArIHN0cihpbmdyZXNzX3BvcnQpKQorICAgICAgICBzZWxmLmRhdGFwbGFuZS5zZW5kKGluZ3Jlc3NfcG9ydCwgc3RyKHBrdCkpCisKKyAgICAgICAgI1ZlcmlmeWluZyBwYWNrZXRzIHJlY2lldmVkIG9uIGV4cGVjdGVkIGRhdGFwbGFuZSBwb3J0cworICAgICAgICB5ZXNfcG9ydHMgPSBzZXQob2ZfcG9ydHMpLmRpZmZlcmVuY2UoW2luZ3Jlc3NfcG9ydF0pCisgICAgICAgIHJlY2VpdmVfcGt0X2NoZWNrKHNlbGYuZGF0YXBsYW5lLCBwa3QsIHllc19wb3J0cywgW2luZ3Jlc3NfcG9ydF0sCisgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYWNfbG9nZ2VyLCBhY19jb25maWcpCisKKworY2xhc3MgRm9yd2FyZENvbnRyb2xsZXIoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKKyAgICAKKyAgICAiIiJGb3J3YXJkQ29udHJvbGxlciA6IFBhY2tldCBpcyBzZW50IHRvIGNvbnRyb2xsZXIgCisgICAgb3V0cHV0LnBvcnQgPSBPRlBQX0NPTlRST0xMRVIiIiIKKworICAgIGRlZiBydW5UZXN0KHNlbGYpOgorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgRm9yd2FyZF9Db250cm9sbGVyIHRlc3QiKQorCisgICAgICAgIG9mX3BvcnRzID0gYWNfcG9ydF9tYXAua2V5cygpCisgICAgICAgIG9mX3BvcnRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9mX3BvcnRzKSA+IDEsICJOb3QgZW5vdWdoIHBvcnRzIGZvciB0ZXN0IikKKyAgICAgICAgCisgICAgICAgICNDbGVhciBzd2l0Y2ggc3RhdGUKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgd2l0aCBvdXRwdXQgYWN0aW9uIHBvcnQgT0ZQUF9DT05UUk9MTEVSIikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBwYWNrZXQgb24gdGhlIGNvbnRyb2wgcGxhbmUiKQorICAgICAgICAKKyAgICAgICAgI0NyZWF0ZSBwYWNrZXQKKyAgICAgICAgcGt0ID0gc2ltcGxlX3RjcF9wYWNrZXQoKQorICAgICAgICBtYXRjaCA9IHBhcnNlLnBhY2tldF90b19mbG93X21hdGNoKHBrdCkKKyAgICAgICAgYWN0ID0gYWN0aW9uLmFjdGlvbl9vdXRwdXQoKQorCisgICAgICAgIGZvciBpbmdyZXNzX3BvcnQgaW4gb2ZfcG9ydHM6CisgICAgICAgICAgICAjRGVsZXRlIGFsbCBmbG93cyAKKyAgICAgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisKKyAgICAgICAgICAgIG1hdGNoLmluX3BvcnQgPSBpbmdyZXNzX3BvcnQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI0NyZWF0ZSBhIGZsb3cgbW9kIG1lc3NhZ2UKKyAgICAgICAgICAgIHJlcXVlc3QgPSBtZXNzYWdlLmZsb3dfbW9kKCkKKyAgICAgICAgICAgIHJlcXVlc3QubWF0Y2ggPSBtYXRjaAorICAgICAgICAgICAgYWN0LnBvcnQgPSBvZnAuT0ZQUF9DT05UUk9MTEVSCisgICAgICAgICAgICByZXF1ZXN0LmFjdGlvbnMuYWRkKGFjdCkKKworICAgICAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydGluZyBmbG93IikKKyAgICAgICAgICAgIHJ2ID0gc2VsZi5jb250cm9sbGVyLm1lc3NhZ2Vfc2VuZChyZXF1ZXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ2ICE9IC0xLCAiRXJyb3IgaW5zdGFsbGluZyBmbG93IG1vZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX2JhcnJpZXIoc2VsZi5jb250cm9sbGVyKSwgMCwgIkJhcnJpZXIgZmFpbGVkIikKKyAgICAgICAgICAgIAorICAgICAgICAgICAgI1NlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93CisgICAgICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZGluZyBwYWNrZXQgdG8gZHAgcG9ydCAiICsgc3RyKGluZ3Jlc3NfcG9ydCkpCisgICAgICAgICAgICBzZWxmLmRhdGFwbGFuZS5zZW5kKGluZ3Jlc3NfcG9ydCwgc3RyKHBrdCkpCisKKyAgICAgICAgICAgICNWZXJpZnlpbmcgcGFja2V0IHJlY2lldmVkIG9uIHRoZSBjb250cm9sIHBsYW5lIHBvcnQKKyAgICAgICAgICAgIChyZXNwb25zZSwgcmF3KSA9IHNlbGYuY29udHJvbGxlci5wb2xsKG9mcC5PRlBUX1BBQ0tFVF9JTiwgdGltZW91dD0xMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwb25zZSBpcyBub3QgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdQYWNrZXQgaW4gbWVzc2FnZSBub3QgcmVjZWl2ZWQgYnkgY29udHJvbGxlcicpCisgICAgCisKKworY2xhc3MgRm9yd2FyZExvY2FsKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CisgICAKKyAgICAiIiJGb3J3YXJkTG9jYWwgOiBQYWNrZXQgaXMgc2VudCB0byAgT0ZQUF9MT0NBTCBwb3J0IC4gCisgICAgICAgIFRCRCA6IFRvIHZlcmlmeSBwYWNrZXQgcmVjaWV2ZWQgaW4gdGhlIGxvY2FsIG5ldHdvcmtpbmcgc3RhY2sgb2Ygc3dpdGNoIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBGb3J3YXJkX0xvY2FsIHRlc3QiKQorCisgICAgICAgIG9mX3BvcnRzID0gYWNfcG9ydF9tYXAua2V5cygpCisgICAgICAgIG9mX3BvcnRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9mX3BvcnRzKSA+IDEsICJOb3QgZW5vdWdoIHBvcnRzIGZvciB0ZXN0IikKKyAgICAgICAgCisgICAgICAgICNDbGVhciBzd2l0Y2ggc3RhdGUKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgd2l0aCBvdXRwdXQgYWN0aW9uIHBvcnQgT0ZQUF9MT0NBTCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdyIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJFeHBlY3RpbmcgcGFja2V0IGluIHRoZSBsb2NhbCBuZXR3b3JraW5nIHN0YWNrIG9mIHN3aXRjaCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KCkKKyAgICAgICAgbWF0Y2ggPSBwYXJzZS5wYWNrZXRfdG9fZmxvd19tYXRjaChwa3QpCisgICAgICAgIGFjdCA9IGFjdGlvbi5hY3Rpb25fb3V0cHV0KCkKKworICAgICAgICBmb3IgaW5ncmVzc19wb3J0IGluIG9mX3BvcnRzOgorICAgICAgICAgICAgI0RlbGV0ZSB0aGUgZmxvd3MKKyAgICAgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisKKyAgICAgICAgICAgIG1hdGNoLmluX3BvcnQgPSBpbmdyZXNzX3BvcnQKKyAgICAgICAgICAgICNDcmVhdGUgZmxvdyBtb2QgbWVzc2FnZQorICAgICAgICAgICAgcmVxdWVzdCA9IG1lc3NhZ2UuZmxvd19tb2QoKQorICAgICAgICAgICAgcmVxdWVzdC5tYXRjaCA9IG1hdGNoCisgICAgICAgICAgICBhY3QucG9ydCA9IG9mcC5PRlBQX0xPQ0FMCisgICAgICAgICAgICByZXF1ZXN0LmFjdGlvbnMuYWRkKGFjdCkKKworICAgICAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydGluZyBmbG93IikKKyAgICAgICAgICAgIHJ2ID0gc2VsZi5jb250cm9sbGVyLm1lc3NhZ2Vfc2VuZChyZXF1ZXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ2ICE9IC0xLCAiRXJyb3IgaW5zdGFsbGluZyBmbG93IG1vZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX2JhcnJpZXIoc2VsZi5jb250cm9sbGVyKSwgMCwgIkJhcnJpZXIgZmFpbGVkIikKKworICAgICAgICAgICAgI1NlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93CisgICAgICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZGluZyBwYWNrZXQgdG8gZHAgcG9ydCAiICsgc3RyKGluZ3Jlc3NfcG9ydCkpCisgICAgICAgICAgICBzZWxmLmRhdGFwbGFuZS5zZW5kKGluZ3Jlc3NfcG9ydCwgc3RyKHBrdCkpCisKKyAgICAgICAgICAgICNUQkQ6IFZlcmlmaWNhdGlvbiBvZiBwYWNrZXRzIGJlaW5nIHJlY2lldmVkLgorCisKK2NsYXNzIEZvcndhcmRGbG9vZChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIkZvcndhcmQ6Rmxvb2QgOiBQYWNrZXQgaXMgc2VudCB0byBhbGwgZGF0YXBsYW5lIHBvcnRzCisgICAgZXhjZXB0IGluZ3Jlc3MgcG9ydCB3aGVuIG91dHB1dCBhY3Rpb24ucG9ydCA9IE9GUFBfRkxPT0QgCisgICAgVEJEIDogVmVyaWZpY2F0aW9uLS0tSW5jYXNlIG9mIFNUUCBiZWluZyBpbXBsZW1lbnRlZCwgZmxvb2QgdGhlIHBhY2tldCBhbG9uZyB0aGUgbWluaW11bSBzcGFubmluZyB0cmVlLAorICAgICAgICAgICAgIG5vdCBpbmNsdWRpbmcgdGhlIGluY29taW5nIGludGVyZmFjZS4gIiIiCisgICAgCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgRm9yd2FyZF9GbG9vZCB0ZXN0IikKKyAgICAgICAgb2ZfcG9ydHMgPSBhY19wb3J0X21hcC5rZXlzKCkKKyAgICAgICAgb2ZfcG9ydHMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ob2ZfcG9ydHMpID4gMSwgIk5vdCBlbm91Z2ggcG9ydHMgZm9yIHRlc3QiKQorICAgICAgICAKKyAgICAgICAgI0NsZWFyIHN3aXRjaCBzdGF0ZQorICAgICAgICBydiA9IGRlbGV0ZV9hbGxfZmxvd3Moc2VsZi5jb250cm9sbGVyLCBhY19sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisgICAgICAgIAorICAgICAgICBhY19sb2dnZXIuaW5mbygiSW5zZXJ0IGEgZmxvdyB3aXRoIG91dHB1dCBhY3Rpb24gcG9ydCBPRlBQX0ZPUldBUkQiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3ciKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiRXhwZWN0aW5nIHBhY2tldCBvbiBhbGwgdGhlIHBvcnRzIGV4Y2VwdCB0aGUgaW5wdXQgcG9ydCIpCisgICAgICAgIAorICAgICAgICAjQ3JlYXRlIGEgcGFja2V0CisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KCkKKyAgICAgICAgbWF0Y2ggPSBwYXJzZS5wYWNrZXRfdG9fZmxvd19tYXRjaChwa3QpCisgICAgICAgIGFjdCA9IGFjdGlvbi5hY3Rpb25fb3V0cHV0KCkKKworICAgICAgICAjRGVsZXRlIGFsbCBmbG93cyAKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorICAgICAgICBpbmdyZXNzX3BvcnQ9b2ZfcG9ydHNbMF0KKyAgICAgICAgbWF0Y2guaW5fcG9ydCA9IGluZ3Jlc3NfcG9ydAorCisgICAgICAgICNDcmVhdGUgYSBmbG93IG1vZCB3aXRoIGFjdGlvbi5wb3J0ID0gT0ZQUF9BTEwKKyAgICAgICAgcmVxdWVzdCA9IG1lc3NhZ2UuZmxvd19tb2QoKQorICAgICAgICByZXF1ZXN0Lm1hdGNoID0gbWF0Y2gKKyAgICAgICAgcmVxdWVzdC5tYXRjaC53aWxkY2FyZHMgPSBvZnAuT0ZQRldfQUxMJn5vZnAuT0ZQRldfSU5fUE9SVAorICAgICAgICBhY3QucG9ydCA9IG9mcC5PRlBQX0ZMT09ECisgICAgICAgIHJlcXVlc3QuYWN0aW9ucy5hZGQoYWN0KQorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydGluZyBmbG93IikKKyAgICAgICAgcnYgPSBzZWxmLmNvbnRyb2xsZXIubWVzc2FnZV9zZW5kKHJlcXVlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydiAhPSAtMSwgIkVycm9yIGluc3RhbGxpbmcgZmxvdyBtb2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX2JhcnJpZXIoc2VsZi5jb250cm9sbGVyKSwgMCwgIkJhcnJpZXIgZmFpbGVkIikKKworICAgICAgICAjU2VuZCBQYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmRpbmcgcGFja2V0IHRvIGRwIHBvcnQgIiArIHN0cihpbmdyZXNzX3BvcnQpKQorICAgICAgICBzZWxmLmRhdGFwbGFuZS5zZW5kKGluZ3Jlc3NfcG9ydCwgc3RyKHBrdCkpCisKKyAgICAgICAgI1ZlcmlmeWluZyBwYWNrZXRzIHJlY2lldmVkIG9uIGV4cGVjdGVkIGRhdGFwbGFuZSBwb3J0cworICAgICAgICB5ZXNfcG9ydHMgPSBzZXQob2ZfcG9ydHMpLmRpZmZlcmVuY2UoW2luZ3Jlc3NfcG9ydF0pCisgICAgICAgIHJlY2VpdmVfcGt0X2NoZWNrKHNlbGYuZGF0YXBsYW5lLCBwa3QsIHllc19wb3J0cywgW2luZ3Jlc3NfcG9ydF0sCisgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYWNfbG9nZ2VyLCBhY19jb25maWcpCisKK2NsYXNzIEZvcndhcmRJbnBvcnQoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKKyAgICAKKyAgICAiIiIgRm9yd2FyZEluUG9ydCA6IFBhY2tldCBzZW50IHRvIHZpcnR1YWwgcG9ydCBJTl9QT1JUCisgICAgSWYgdGhlIG91dHB1dC5wb3J0ID0gT0ZQUC5JTlBPUlQgdGhlbiB0aGUgcGFja2V0IGlzIHNlbnQgdG8gdGhlIGlucHV0IHBvcnQgaXRzZWxmIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBGb3J3YXJkX0lucG9ydCB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKyAgICAgICAgCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggb3V0cHV0IGFjdGlvbiBwb3J0IE9GUFBfSU5QT1JUIikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBwYWNrZXQgb24gdGhlIGlucHV0IHBvcnQiKQorICAgICAgICAKKyAgICAgICAgI0NyZWF0ZSBhIHBhY2tldAorICAgICAgICBwa3QgPSBzaW1wbGVfdGNwX3BhY2tldCgpCisgICAgICAgIG1hdGNoID0gcGFyc2UucGFja2V0X3RvX2Zsb3dfbWF0Y2gocGt0KQorICAgICAgICBhY3QgPSBhY3Rpb24uYWN0aW9uX291dHB1dCgpCisKKyAgICAgICAgI0RlbGV0ZSB0aGUgZmxvd3MKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorICAgICAgICBpbmdyZXNzX3BvcnQ9b2ZfcG9ydHNbMF0KKyAgICAgICAgbWF0Y2guaW5fcG9ydCA9IGluZ3Jlc3NfcG9ydAorCisgICAgICAgICMgQ3JlYXRlIGEgZmxvdyBtb2QgbWVzc2FnZQorICAgICAgICByZXF1ZXN0ID0gbWVzc2FnZS5mbG93X21vZCgpCisgICAgICAgIHJlcXVlc3QubWF0Y2ggPSBtYXRjaAorICAgICAgICBhY3QucG9ydCA9IG9mcC5PRlBQX0lOX1BPUlQKKyAgICAgICAgICAgIAorICAgICAgICByZXF1ZXN0LmFjdGlvbnMuYWRkKGFjdCkKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydGluZyBmbG93IikKKyAgICAgICAgcnYgPSBzZWxmLmNvbnRyb2xsZXIubWVzc2FnZV9zZW5kKHJlcXVlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydiAhPSAtMSwgIkVycm9yIGluc3RhbGxpbmcgZmxvdyBtb2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX2JhcnJpZXIoc2VsZi5jb250cm9sbGVyKSwgMCwgIkJhcnJpZXIgZmFpbGVkIikKKworICAgICAgICAjU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmRpbmcgcGFja2V0IHRvIGRwIHBvcnQgIiArIHN0cihpbmdyZXNzX3BvcnQpKQorICAgICAgICBzZWxmLmRhdGFwbGFuZS5zZW5kKGluZ3Jlc3NfcG9ydCwgc3RyKHBrdCkpCisgICAgICAgIHllc19wb3J0cyA9IFtpbmdyZXNzX3BvcnRdCisKKyAgICAgICAgI1ZlcmZ5aW5nIHBhY2tldCByZWNpZXZlZCBvbiBleHBlY3RlZCBkYXRhcGxhbmUgcG9ydHMKKyAgICAgICAgcmVjZWl2ZV9wa3RfY2hlY2soc2VsZi5kYXRhcGxhbmUsIHBrdCwgeWVzX3BvcnRzLHNldChvZl9wb3J0cykuZGlmZmVyZW5jZShbaW5ncmVzc19wb3J0XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYWNfbG9nZ2VyLCBhY19jb25maWcpICAgICAgCisKK2NsYXNzIEZvcndhcmRUYWJsZShiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgCisgICAgIiIiRm9yd2FyZFRhYmxlIDogUGVyZm9ybSBhY3Rpb25zIGluIGZsb3cgdGFibGUuIE9ubHkgZm9yIHBhY2tldC1vdXQgbWVzc2FnZXMuCisgICAgICAgIElmIHRoZSBvdXRwdXQgYWN0aW9uLnBvcnQgaW4gdGhlIHBhY2tldG91dCBtZXNzYWdlID0gT0ZQLlRBQkxFICwgdGhlbiAKKyAgICAgICAgdGhlIHBhY2tldCBpbXBsZW1lbnRzIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGluIHRoZSBtYXRjaGluZyBmbG93IG9mIHRoZSBGTE9XLVRBQkxFIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBGb3J3YXJkX1RhYmxlIHRlc3QiKQorCisgICAgICAgIG9mX3BvcnRzID0gYWNfcG9ydF9tYXAua2V5cygpCisgICAgICAgIG9mX3BvcnRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9mX3BvcnRzKSA+IDEsICJOb3QgZW5vdWdoIHBvcnRzIGZvciB0ZXN0IikKKyAgICAgICAgCisgICAgICAgICNDbGVhciBzd2l0Y2ggc3RhdGUKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgRiB3aXRoIG91dHB1dCBhY3Rpb24gcG9ydCBzZXQgdG8gc29tZSBlZ3Jlc3NfcG9ydCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBvdXQgbWVzc2FnZSAobWF0Y2hpbmcgZmxvdyBGKSB3aXRoIGFjdGlvbi5wb3J0ID0gT0ZQLlRBQkxFIikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBwYWNrZXQgb24gdGhlIGVncmVzc19wb3J0IikKKyAgICAgICAgCisgICAgICAgICNJbnNlcnQgYSBhbGwgd2lsZGNhcmRlZCBmbG93CisgICAgICAgIChwa3QsbWF0Y2gpID0gV2lsZGNhcmRfQWxsKHNlbGYsb2ZfcG9ydHMpCisgICAgICAgIAorICAgICAgICAjQ3JlYXRlIGEgcGFja2V0IG91dCBtZXNzYWdlCisgICAgICAgIHBrdF9vdXQgPW1lc3NhZ2UucGFja2V0X291dCgpOworICAgICAgICBwa3Rfb3V0LmRhdGEgPSBzdHIocGt0KQorICAgICAgICBwa3Rfb3V0LmluX3BvcnQgPSBvZl9wb3J0c1swXQorICAgICAgICBhY3QgPSBhY3Rpb24uYWN0aW9uX291dHB1dCgpCisgICAgICAgIGFjdC5wb3J0ID0gb2ZwLk9GUFBfVEFCTEUKKyAgICAgICAgcGt0X291dC5hY3Rpb25zLmFkZChhY3QpCisgICAgICAgIHJ2ID0gc2VsZi5jb250cm9sbGVyLm1lc3NhZ2Vfc2VuZChwa3Rfb3V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnYgPT0gMCwgIkVycm9yIHNlbmRpbmcgb3V0IG1lc3NhZ2UiKQorCisgICAgICAgICNWZXJpZnlpbmcgcGFja2V0IG91dCBtZXNzYWdlIHJlY2lldmVkIG9uIHRoZSBleHBlY3RlZCBkYXRhcGxhbmUgcG9ydC4gCisgICAgICAgIChvZl9wb3J0LCBwa3QsIHBrdF90aW1lKSA9IHNlbGYuZGF0YXBsYW5lLnBvbGwocG9ydF9udW1iZXI9b2ZfcG9ydHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwX3BrdD1wa3QsdGltZW91dD0zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGt0IGlzIG5vdCBOb25lLCAnUGFja2V0IG5vdCByZWNlaXZlZCcpCisKKworY2xhc3MgQWRkVmxhblRhZyhiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIkFkZFZsYW5UYWcgOiBBZGRzIFZMQU4gVGFnIHRvIHVudGFnZ2VkIHBhY2tldC4iIiIKKworICAgIGRlZiBydW5UZXN0KHNlbGYpOgorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJSdW5uaW5nIEFkZF92bGFuX3RhZyB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIHNldCB2bGFuIGlkLCBpZiBub3Qgc2tpcCB0aGUgdGVzdCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggc2V0IHZpZCBhY3Rpb24iKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cgLCB2ZXJpZnkgcmVjaWV2ZWQgcGFja2V0IGhhcyB2aWQgc2V0IikKKyAgICAgICAgCisgICAgICAgICNWZXJpZnkgc2V0X3ZsYW5faWQgaXMgYSBzdXBwb3J0ZWQgYWN0aW9uCisgICAgICAgIHN1cF9hY3RzID0gc3dfc3VwcG9ydGVkX2FjdGlvbnMoc2VsZikKKyAgICAgICAgaWYgbm90KHN1cF9hY3RzICYgMTw8b2ZwLk9GUEFUX1NFVF9WTEFOX1ZJRCk6CisgICAgICAgICAgIHNraXBfbWVzc2FnZV9lbWl0KHNlbGYsICJBZGQgVkxBTiB0YWcgdGVzdCBza2lwcGVkIikKKyAgICAgICAgICAgcmV0dXJuCisgICAgICAgIAorICAgICAgICAjQ3JlYXRlIHBhY2tldCB0byBiZSBzZW50IGFuZCBhbiBleHBlY3RlZCBwYWNrZXQgd2l0aCB2aWQgc2V0CisgICAgICAgIG5ld192aWQgPSAyCisgICAgICAgIGxlbl93b192aWQgPSAxMDAKKyAgICAgICAgbGVuX3dfdmlkID0gMTA0CisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KHBrdGxlbj1sZW5fd29fdmlkKQorICAgICAgICBleHBfcGt0ID0gc2ltcGxlX3RjcF9wYWNrZXQocGt0bGVuPWxlbl93X3ZpZCwgZGxfdmxhbl9lbmFibGU9VHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbF92bGFuPW5ld192aWQsZGxfdmxhbl9wY3A9MCkKKyAgICAgICAgdmlkX2FjdCA9IGFjdGlvbi5hY3Rpb25fc2V0X3ZsYW5fdmlkKCkKKyAgICAgICAgdmlkX2FjdC52bGFuX3ZpZCA9IG5ld192aWQKKworICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IHZpZCAsIFNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93LCBWZXJpZnkgcmVjaWV2ZWQgcGFja2V0IGlzIGV4cGVjdGVkIHBhY2tldAorICAgICAgICBmbG93X21hdGNoX3Rlc3Qoc2VsZiwgYWNfcG9ydF9tYXAsIHBrdD1wa3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwX3BrdD1leHBfcGt0LCBhY3Rpb25fbGlzdD1bdmlkX2FjdF0pCisKK2NsYXNzIE1vZGlmeVZsYW5UYWcoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKKworICAgICIiIk1vZGlmeVZsYW5UYWcgOiBNb2RpZmllcyBWTEFOIFRhZyB0byB0YWdnZWQgcGFja2V0LiIiIgorICAgIAorICAgIGRlZiBydW5UZXN0KHNlbGYpOgorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE1vZGlmeV9WbGFuX1RhZyB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIG1vZGlmeSB2bGFuIGlkLCBpZiBub3Qgc2tpcCB0aGUgdGVzdCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uIC0tc2V0IHZpZCAiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCB0YWdnZWQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93ICwgdmVyaWZ5IHJlY2lldmVkIHBhY2tldCBoYXMgdmlkIHJld3JpdHRlbiIpCisgICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF92bGFuX2lkIGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYpCisgICAgICAgIGlmIG5vdCAoc3VwX2FjdHMgJiAxIDw8IG9mcC5PRlBBVF9TRVRfVkxBTl9WSUQpOgorICAgICAgICAgICAgc2tpcF9tZXNzYWdlX2VtaXQoc2VsZiwgIk1vZGlmeSBWTEFOIHRhZyB0ZXN0IHNraXBwZWQiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgI0NyZWF0ZSBhIHRhZ2dlZCBwYWNrZXQgd2l0aCBvbGRfdmlkIHRvIGJlIHNlbnQsIGFuZCBleHBlY3RlZCBwYWNrZXQgd2l0aCBuZXdfdmlkCisgICAgICAgIG9sZF92aWQgPSAyCisgICAgICAgIG5ld192aWQgPSAzCisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KGRsX3ZsYW5fZW5hYmxlPVRydWUsIGRsX3ZsYW49b2xkX3ZpZCkKKyAgICAgICAgZXhwX3BrdCA9IHNpbXBsZV90Y3BfcGFja2V0KGRsX3ZsYW5fZW5hYmxlPVRydWUsIGRsX3ZsYW49bmV3X3ZpZCkKKyAgICAgICAgdmlkX2FjdCA9IGFjdGlvbi5hY3Rpb25fc2V0X3ZsYW5fdmlkKCkKKyAgICAgICAgdmlkX2FjdC52bGFuX3ZpZCA9IG5ld192aWQKKyAgICAgICAgCisgICAgICAgICNJbnNlcnQgZmxvdyB3aXRoIGFjdGlvbiAtLSBzZXQgdmlkICwgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3cuVmVyaWZ5IHJlY2lldmVkIHBhY2tldCBpcyBleHBlY3RlZCBwYWNrZXQuCisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xpc3Q9W3ZpZF9hY3RdKQorICAgICAgICAKK2NsYXNzIFZsYW5QcmlvMShiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgCisgICAgIiIiQWRkVmxhblByaW9VbnRhZ2dlZFBrdCA6IEFkZCBWTEFOIHByaW9yaXR5IHRvIHVudGFnZ2VkIHBhY2tldC4iIiIKKyAgICAKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyB2bGFuX1ByaW9fMSB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIHNldCB2bGFuIHByaW9yaXR5LCBpZiBub3Qgc2tpcCB0aGUgdGVzdCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uIC0tIHNldCB2bGFuIHByaW9yaXR5ICIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHVudGFnZ2VkIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdyAsIHZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaGFzIHNwZWNpZmllZCBWTEFOIHByaW9yaXR5IGFuZCBoYXMgdmlkIHNldCB0TyAwICIpCisgICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF92bGFuX3ByaW9yaXR5IGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYpCisgICAgICAgIGlmIG5vdCAoc3VwX2FjdHMgJiAxIDw8IG9mcC5PRlBBVF9TRVRfVkxBTl9QQ1ApOgorICAgICAgICAgICAgc2tpcF9tZXNzYWdlX2VtaXQoc2VsZiwgIlNldCBWTEFOIHByaW9yaXR5IHRlc3Qgc2tpcHBlZCIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgICNDcmVhdGUgYSB1bnRhZ2dlZCBwYWNrZXQgdG8gYmUgc2VudCBhbmQgYW4gZXhwZWN0ZWQgcGFja2V0IHdpdGggdmlkID0gMCAsIHZsYW5fcHJpb3JpdHkgc2V0LiAKKyAgICAgICAgdmxhbl9pZCA9IDAKKyAgICAgICAgcGt0ID0gc2ltcGxlX3RjcF9wYWNrZXQoKQorICAgICAgICBleHBfcGt0ID0gc2ltcGxlX3RjcF9wYWNrZXQoZGxfdmxhbl9lbmFibGU9VHJ1ZSwgZGxfdmxhbj12bGFuX2lkLGRsX3ZsYW5fcGNwPTApCisgICAgICAgIGFjdCA9IGFjdGlvbi5hY3Rpb25fc2V0X3ZsYW5fdmlkKCkKKworICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IHZMQU4gcHJpb3JpdHksIFNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93LCBWZXJpZnkgcmVjaWV2ZWQgcGFja2V0IGlzIGV4cGVjdGVkIHBhY2tldAorICAgICAgICBmbG93X21hdGNoX3Rlc3Qoc2VsZiwgYWNfcG9ydF9tYXAsIHBrdD1wa3QsIGV4cF9wa3Q9ZXhwX3BrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xpc3Q9W2FjdF0pCisKKworY2xhc3MgVmxhblByaW8yKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CisgICAgCisgICAgIiIiTW9kaWZ5VmxhblByaW8gOiBNb2RpZnkgVkxBTiBwcmlvcml0eSB0byB0YWdnZWQgcGFja2V0LiIiIgorICAgIAorICAgIGRlZiBydW5UZXN0KHNlbGYpOgorICAgICAgICAKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgVmxhbl9QcmlvXzIgdGVzdCIpCisKKyAgICAgICAgb2ZfcG9ydHMgPSBhY19wb3J0X21hcC5rZXlzKCkKKyAgICAgICAgb2ZfcG9ydHMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ob2ZfcG9ydHMpID4gMSwgIk5vdCBlbm91Z2ggcG9ydHMgZm9yIHRlc3QiKQorICAgICAgICAKKyAgICAgICAgI0NsZWFyIHN3aXRjaCBzdGF0ZQorICAgICAgICBydiA9IGRlbGV0ZV9hbGxfZmxvd3Moc2VsZi5jb250cm9sbGVyLCBhY19sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlZlcmlmeSBpZiBzd2l0Y2ggc3VwcG9ydHMgdGhlIGFjdGlvbiAtLSBzZXQgdmxhbiBwcmlvcml0eSwgaWYgbm90IHNraXAgdGhlIHRlc3QiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiAtLSBzZXQgdmxhbiBwcmlvcml0eSAiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCB0YWdnZWQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93LCB2ZXJpZnkgcmVjaWV2ZWQgcGFja2V0IGhhcyB2bGFuIHByaW9yaXR5IHJld3JpdHRlbiIpCisgICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF92bGFuX3ByaW9yaXR5IGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYsInRydWUiKQorICAgICAgICBpZiBub3QgKHN1cF9hY3RzICYgMSA8PCBvZnAuT0ZQQVRfU0VUX1ZMQU5fUENQKToKKyAgICAgICAgICAgIHNraXBfbWVzc2FnZV9lbWl0KHNlbGYsICJtb2RpZnlfdmxhbl9wcmlvIHRlc3Qgc2tpcHBlZCIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgCisgICAgICAgICNDcmVhdGUgYSB0YWdnZWQgcGFja2V0ICwgYW5kIGFuIGV4cGVjdGVkIHBhY2tldCB3aXRoIHZsYW5fcHJpb3JpdHkgc2V0IHRvIHNwZWNpZmllZCB2YWx1ZQorICAgICAgICB2aWQgICAgICAgICAgPSAxMjMKKyAgICAgICAgb2xkX3ZsYW5fcGNwID0gMgorICAgICAgICBuZXdfdmxhbl9wY3AgPSAzCisgICAgICAgIHBrdCA9IHNpbXBsZV90Y3BfcGFja2V0KGRsX3ZsYW5fZW5hYmxlPVRydWUsIGRsX3ZsYW49dmlkLCBkbF92bGFuX3BjcD1vbGRfdmxhbl9wY3ApCisgICAgICAgIGV4cF9wa3QgPSBzaW1wbGVfdGNwX3BhY2tldChkbF92bGFuX2VuYWJsZT1UcnVlLCBkbF92bGFuPXZpZCwgZGxfdmxhbl9wY3A9bmV3X3ZsYW5fcGNwKQorICAgICAgICB2aWRfYWN0ID0gYWN0aW9uLmFjdGlvbl9zZXRfdmxhbl9wY3AoKQorICAgICAgICB2aWRfYWN0LnZsYW5fcGNwID0gbmV3X3ZsYW5fcGNwCisKKyAgICAgICAgI0luc2VydCBmbG93IHdpdGggYWN0aW9uIC0tIHNldCB2TEFOIHByaW9yaXR5LCBTZW5kIHRhZ2dlZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIFZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaXMgZXhwZWN0ZWQgcGFja2V0CisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xpc3Q9W3ZpZF9hY3RdKQorCisKK2NsYXNzIE1vZGlmeUwyU3JjKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CisgICAgCisgICAgIiIiTW9kaWZ5TDJTcmMgOk1vZGlmeSB0aGUgc291cmNlIE1BQyBhZGRyZXNzIiIiCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBNb2RpZnlfTDJfU3JjIHRlc3QiKQorCisgICAgICAgIG9mX3BvcnRzID0gYWNfcG9ydF9tYXAua2V5cygpCisgICAgICAgIG9mX3BvcnRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9mX3BvcnRzKSA+IDEsICJOb3QgZW5vdWdoIHBvcnRzIGZvciB0ZXN0IikKKyAgICAgICAgCisgICAgICAgICNDbGVhciBzd2l0Y2ggc3RhdGUKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJWZXJpZnkgaWYgc3dpdGNoIHN1cHBvcnRzIHRoZSBhY3Rpb24gLS0gbW9kaWZ5X2wyX3NyYywgaWYgbm90IHNraXAgdGhlIHRlc3QiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiAtLSBzZXQgZXRoZXJlbnQgc3JjIGFkZHJlc3MiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIHZlcmlmeSByZWNpZXZlZCBwYWNrZXQgc3JjIGFkZHJlc3MgcmV3cml0dGVuICIpCisKKyAgICAgICAgI1ZlcmlmeSBzZXRfZGxfc3JjIGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYsdXNlX2NhY2hlPSJ0cnVlIikKKyAgICAgICAgaWYgbm90IChzdXBfYWN0cyAmIDEgPDwgb2ZwLk9GUEFUX1NFVF9ETF9TUkMpOgorICAgICAgICAgICAgc2tpcF9tZXNzYWdlX2VtaXQoc2VsZiwgIm1vZGlmeV9sMl9zcmMgdGVzdCBza2lwcGVkIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICNDcmVhdGUgcGFja2V0IHRvIGJlIHNlbnQgYW5kIGV4cGVjdGVkIHBhY2tldCB3aXRoIGRsX3NyYyBzZXQgdG8gc3BlY2lmaWVkIHZhbHVlCisgICAgICAgIChwa3QsIGV4cF9wa3QsIGFjdHMpID0gcGt0X2FjdGlvbl9zZXR1cChzZWxmLCBtb2RfZmllbGRzPVsnZGxfc3JjJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja190ZXN0X3BhcmFtcz1UcnVlKQorICAgICAgICAKKyAgICAgICAgI0luc2VydCBmbG93IHdpdGggYWN0aW9uIC0tIHNldCBzcmMgYWRkcmVzcywgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIFZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaXMgZXhwZWN0ZWQgcGFja2V0CisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9saXN0PWFjdHMsIG1heF90ZXN0PTIpCisKKworY2xhc3MgTW9kaWZ5TDJEc3QoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKKyAgICAKKyAgICAiIiJNb2RpZnlMMlNEU3QgOk1vZGlmeSB0aGUgZGVzdCBNQUMgYWRkcmVzcyIiIgorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgTW9kaWZ5X0wyX0RzdCB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIG1vZGlmeV9sMl9kc3QsIGlmIG5vdCBza2lwIHRoZSB0ZXN0IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IGV0aGVyZW50IGRzdCBhZGRyZXNzICIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgdmVyaWZ5IHJlY2lldmVkIHBhY2tldCBkc3QgYWRkcmVzcyByZXdyaXR0ZW4gIikKKworICAgICAgICAjVmVyaWZ5IHNldF9kbF9kc3QgaXMgYSBzdXBwb3J0ZWQgYWN0aW9uCisgICAgICAgIHN1cF9hY3RzID0gc3dfc3VwcG9ydGVkX2FjdGlvbnMoc2VsZikKKyAgICAgICAgaWYgbm90IChzdXBfYWN0cyAmIDEgPDwgb2ZwLk9GUEFUX1NFVF9ETF9EU1QpOgorICAgICAgICAgICAgc2tpcF9tZXNzYWdlX2VtaXQoc2VsZiwgIm1vZGlmeV9sMl9kc3QgdGVzdCBza2lwcGVkIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICNDcmVhdGUgcGFja2V0IHRvIGJlIHNlbnQgYW5kIGV4cGVjdGVkIHBhY2tldCB3aXRoIGRsX3NyYyBzZXQgdG8gc3BlY2lmaWVkIHZhbHVlCisgICAgICAgIChwa3QsIGV4cF9wa3QsIGFjdHMpID0gcGt0X2FjdGlvbl9zZXR1cChzZWxmLCBtb2RfZmllbGRzPVsnZGxfZHN0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja190ZXN0X3BhcmFtcz1UcnVlKQorICAgICAgICAKKyAgICAgICAgI0luc2VydCBmbG93IHdpdGggYWN0aW9uIC0tIHNldCBkc3QgYWRkcmVzcywgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIFZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaXMgZXhwZWN0ZWQgcGFja2V0CisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9saXN0PWFjdHMsIG1heF90ZXN0PTIpCisKK2NsYXNzIE1vZGlmeUwzU3JjKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CisgICAgCisgICAgIiIiTW9kaWZ5TDNTcmMgOiBNb2RpZnkgdGhlIHNvdXJjZSBJUCBhZGRyZXNzIG9mIGFuIElQIHBhY2tldCAiIiIKKworICAgIGRlZiBydW5UZXN0KHNlbGYpOgorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE1vZGlmeV9MM19TcmMgdGVzdCIpCisKKyAgICAgICAgb2ZfcG9ydHMgPSBhY19wb3J0X21hcC5rZXlzKCkKKyAgICAgICAgb2ZfcG9ydHMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ob2ZfcG9ydHMpID4gMSwgIk5vdCBlbm91Z2ggcG9ydHMgZm9yIHRlc3QiKQorICAgICAgICAKKyAgICAgICAgI0NsZWFyIHN3aXRjaCBzdGF0ZQorICAgICAgICBydiA9IGRlbGV0ZV9hbGxfZmxvd3Moc2VsZi5jb250cm9sbGVyLCBhY19sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlZlcmlmeSBpZiBzd2l0Y2ggc3VwcG9ydHMgdGhlIGFjdGlvbiAtLSBtb2RpZnlfbDNfc3JjLCBpZiBub3Qgc2tpcCB0aGUgdGVzdCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uIC0tIHNldCBuZXR3b3JrIHNyYyBhZGRyZXNzICIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgdmVyaWZ5IHJlY2lldmVkIHBhY2tldCBuZXR3b3JrIHNyYyBhZGRyZXNzIHJld3JpdHRlbiAiKQorICAgICAgICAKKyAgICAgICAgI1ZlcmlmeSBzZXRfbndfc3JjIGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYpCisgICAgICAgIGlmIG5vdCAoc3VwX2FjdHMgJiAxIDw8IG9mcC5PRlBBVF9TRVRfTldfU1JDKToKKyAgICAgICAgICAgIHNraXBfbWVzc2FnZV9lbWl0KHNlbGYsICJtb2RpZnlfbDNfc3JjIHRlc3QiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgI0NyZWF0ZSBwYWNrZXQgdG8gYmUgc2VudCBhbmQgZXhwZWN0ZWQgcGFja2V0IHdpdGggbndfc3JjIHNldCB0byBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgKHBrdCwgZXhwX3BrdCwgYWN0cykgPSBwa3RfYWN0aW9uX3NldHVwKHNlbGYsIG1vZF9maWVsZHM9WydpcF9zcmMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3Rlc3RfcGFyYW1zPVRydWUpCisgICAgICAgIAorICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IG53IHNyYyBhZGRyZXNzLCBTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgVmVyaWZ5IHJlY2lldmVkIHBhY2tldCBpcyBleHBlY3RlZCBwYWNrZXQKKyAgICAgICAgZmxvd19tYXRjaF90ZXN0KHNlbGYsIGFjX3BvcnRfbWFwLCBwa3Q9cGt0LCBleHBfcGt0PWV4cF9wa3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xpc3Q9YWN0cywgbWF4X3Rlc3Q9MikKKworY2xhc3MgTW9kaWZ5TDNEc3QoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKKyAgICAKKyAgICAiIiJNb2RpZnlMM0RzdCA6TW9kaWZ5IHRoZSBkZXN0IElQIGFkZHJlc3Mgb2YgYW4gSVAgcGFja2V0IiIiCisgICAgCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgTW9kaWZ5X0wzX0RzdCB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIG1vZGlmeV9sM19kc3QsIGlmIG5vdCBza2lwIHRoZSB0ZXN0IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IG5ldHdvcmsgZHN0IGFkZHJlc3MgIikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93LCB2ZXJpZnkgcmVjaWV2ZWQgcGFja2V0IG5ldHdvcmsgZHN0IGFkZHJlc3MgcmV3cml0dGVuICIpCisKKyAgICAgICAgI1ZlcmlmeSBzZXRfbndfZHN0IGlzIGEgc3VwcG9ydGVkIGFjdGlvbgorICAgICAgICBzdXBfYWN0cyA9IHN3X3N1cHBvcnRlZF9hY3Rpb25zKHNlbGYsdXNlX2NhY2hlPSJ0cnVlIikKKyAgICAgICAgaWYgbm90IChzdXBfYWN0cyAmIDEgPDwgb2ZwLk9GUEFUX1NFVF9OV19EU1QpOgorICAgICAgICAgICAgc2tpcF9tZXNzYWdlX2VtaXQoc2VsZiwgIm1vZGlmeV9sM19kc3QgdGVzdCBza2lwcGVkIikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAKKyAgICAgICAgI0NyZWF0ZSBwYWNrZXQgdG8gYmUgc2VudCBhbmQgZXhwZWN0ZWQgcGFja2V0IHdpdGggbndfZHN0IHNldCB0byBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgKHBrdCwgZXhwX3BrdCwgYWN0cykgPSBwa3RfYWN0aW9uX3NldHVwKHNlbGYsIG1vZF9maWVsZHM9WydpcF9kc3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3Rlc3RfcGFyYW1zPVRydWUpCisgICAgICAgIAorICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IG53IGRzdCBhZGRyZXNzLCBTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgVmVyaWZ5IHJlY2lldmVkIHBhY2tldCBpcyBleHBlY3RlZCBwYWNrZXQKKyAgICAgICAgZmxvd19tYXRjaF90ZXN0KHNlbGYsIGFjX3BvcnRfbWFwLCBwa3Q9cGt0LCBleHBfcGt0PWV4cF9wa3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xpc3Q9YWN0cywgbWF4X3Rlc3Q9MikKKworCitjbGFzcyBNb2RpZnlMNFNyYyhiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIk1vZGlmeUw0U3JjIDogTW9kaWZ5IHRoZSBzb3VyY2UgVENQIHBvcnQgb2YgYSBUQ1AgcGFja2V0IiIiCisgICAgCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgTW9kaWZ5X0w0X1NyYyB0ZXN0IikKKworICAgICAgICBvZl9wb3J0cyA9IGFjX3BvcnRfbWFwLmtleXMoKQorICAgICAgICBvZl9wb3J0cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvZl9wb3J0cykgPiAxLCAiTm90IGVub3VnaCBwb3J0cyBmb3IgdGVzdCIpCisgICAgICAgIAorICAgICAgICAjQ2xlYXIgc3dpdGNoIHN0YXRlCisgICAgICAgIHJ2ID0gZGVsZXRlX2FsbF9mbG93cyhzZWxmLmNvbnRyb2xsZXIsIGFjX2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydiwgMCwgIkZhaWxlZCB0byBkZWxldGUgYWxsIGZsb3dzIikKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiVmVyaWZ5IGlmIHN3aXRjaCBzdXBwb3J0cyB0aGUgYWN0aW9uIC0tIG1vZGlmeV9sNF9zcmMsIGlmIG5vdCBza2lwIHRoZSB0ZXN0IikKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIkluc2VydCBhIGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IHNyYyB0Y3AgcG9ydCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgdmVyaWZ5IHJlY2lldmVkIHBhY2tldCBzcmMgdGNwIHBvcnQgaXMgcmV3cml0dGVuICIpCisgICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF90cF9zcmMgaXMgYSBzdXBwb3J0ZWQgYWN0aW9uCisgICAgICAgIHN1cF9hY3RzID0gc3dfc3VwcG9ydGVkX2FjdGlvbnMoc2VsZix1c2VfY2FjaGU9InRydWUiKQorICAgICAgICBpZiBub3QgKHN1cF9hY3RzICYgMSA8PCBvZnAuT0ZQQVRfU0VUX1RQX1NSQyk6CisgICAgICAgICAgICBza2lwX21lc3NhZ2VfZW1pdChzZWxmLCAibW9kaWZ5X2w0X3NyYyB0ZXN0IHNraXBwZWQiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgI0NyZWF0ZSBwYWNrZXQgdG8gYmUgc2VudCBhbmQgZXhwZWN0ZWQgcGFja2V0IHdpdGggdGNwX3NyYyBzZXQgdG8gc3BlY2lmaWVkIHZhbHVlCisgICAgICAgIChwa3QsIGV4cF9wa3QsIGFjdHMpID0gcGt0X2FjdGlvbl9zZXR1cChzZWxmLCBtb2RfZmllbGRzPVsndGNwX3Nwb3J0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja190ZXN0X3BhcmFtcz1UcnVlKQorICAgICAgICAKKyAgICAgICAgI0luc2VydCBmbG93IHdpdGggYWN0aW9uIC0tIHNldCB0Y3Agc3JjIHBvcnQsIFNlbmQgcGFja2V0IG1hdGNoaW5nIHRoZSBmbG93LCBWZXJpZnkgcmVjaWV2ZWQgcGFja2V0IGlzIGV4cGVjdGVkIHBhY2tldAorICAgICAgICBmbG93X21hdGNoX3Rlc3Qoc2VsZiwgYWNfcG9ydF9tYXAsIHBrdD1wa3QsIGV4cF9wa3Q9ZXhwX3BrdCwgCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbGlzdD1hY3RzLCBtYXhfdGVzdD0yKQorCitjbGFzcyBNb2RpZnlMNERzdChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIiBNb2RpZnlMNERzdDogTW9kaWZ5IHRoZSBkZXN0IFRDUCBwb3J0IG9mIGEgVENQIHBhY2tldCAiIiIKKworICAgIGRlZiBydW5UZXN0KHNlbGYpOgorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE1vZGlmeV9MNF9Ec3QgdGVzdCIpCisKKyAgICAgICAgb2ZfcG9ydHMgPSBhY19wb3J0X21hcC5rZXlzKCkKKyAgICAgICAgb2ZfcG9ydHMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ob2ZfcG9ydHMpID4gMSwgIk5vdCBlbm91Z2ggcG9ydHMgZm9yIHRlc3QiKQorICAgICAgICAKKyAgICAgICAgI0NsZWFyIHN3aXRjaCBzdGF0ZQorICAgICAgICBydiA9IGRlbGV0ZV9hbGxfZmxvd3Moc2VsZi5jb250cm9sbGVyLCBhY19sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnYsIDAsICJGYWlsZWQgdG8gZGVsZXRlIGFsbCBmbG93cyIpCisKKyAgICAgICAgYWNfbG9nZ2VyLmluZm8oIlZlcmlmeSBpZiBzd2l0Y2ggc3VwcG9ydHMgdGhlIGFjdGlvbiAtLSBtb2RpZnlfbDRfZHN0LCBpZiBub3Qgc2tpcCB0aGUgdGVzdCIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJJbnNlcnQgYSBmbG93IHdpdGggYWN0aW9uIC0tIHNldCBkc3QgdGNwIHBvcnQiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIHZlcmlmeSByZWNpZXZlZCBwYWNrZXQgZHN0IHRjcCBwb3J0IGlzIHJld3JpdHRlbiAiKQorICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF90cF9kc3QgaXMgYSBzdXBwb3J0ZWQgYWN0aW9uCisgICAgICAgIHN1cF9hY3RzID0gc3dfc3VwcG9ydGVkX2FjdGlvbnMoc2VsZix1c2VfY2FjaGU9InRydWUiKQorICAgICAgICBpZiBub3QgKHN1cF9hY3RzICYgMSA8PCBvZnAuT0ZQQVRfU0VUX1RQX0RTVCk6CisgICAgICAgICAgICBza2lwX21lc3NhZ2VfZW1pdChzZWxmLCAiTW9kaWZ5TDREc3QgdGVzdCIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjQ3JlYXRlIHBhY2tldCB0byBiZSBzZW50IGFuZCBleHBlY3RlZCBwYWNrZXQgd2l0aCB0Y3BfZHN0IHNldCB0byBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgKHBrdCwgZXhwX3BrdCwgYWN0cykgPSBwa3RfYWN0aW9uX3NldHVwKHNlbGYsIG1vZF9maWVsZHM9Wyd0Y3BfZHBvcnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3Rlc3RfcGFyYW1zPVRydWUpCisgICAgICAgIAorICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IHRjcCBkc3QgcG9ydCwgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIFZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaXMgZXhwZWN0ZWQgcGFja2V0CisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9saXN0PWFjdHMsIG1heF90ZXN0PTIpCisKK2NsYXNzIE1vZGlmeVRvcyhiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorICAgIAorICAgICIiIk1vZGlmeVRPUyA6TW9kaWZ5IHRoZSBJUCB0eXBlIG9mIHNlcnZpY2Ugb2YgYW4gSVAgcGFja2V0IiIiCisgICAKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKworICAgICAgICBhY19sb2dnZXIuaW5mbygiUnVubmluZyBNb2RpZnlfVG9zIHRlc3QiKQorCisgICAgICAgIG9mX3BvcnRzID0gYWNfcG9ydF9tYXAua2V5cygpCisgICAgICAgIG9mX3BvcnRzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9mX3BvcnRzKSA+IDEsICJOb3QgZW5vdWdoIHBvcnRzIGZvciB0ZXN0IikKKyAgICAgICAgCisgICAgICAgICNDbGVhciBzd2l0Y2ggc3RhdGUKKyAgICAgICAgcnYgPSBkZWxldGVfYWxsX2Zsb3dzKHNlbGYuY29udHJvbGxlciwgYWNfbG9nZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2LCAwLCAiRmFpbGVkIHRvIGRlbGV0ZSBhbGwgZmxvd3MiKQorCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJWZXJpZnkgaWYgc3dpdGNoIHN1cHBvcnRzIHRoZSBhY3Rpb24gLS0gbW9kaWZ5X3RvcywgaWYgbm90IHNraXAgdGhlIHRlc3QiKQorICAgICAgICBhY19sb2dnZXIuaW5mbygiSW5zZXJ0IGEgZmxvdyB3aXRoIGFjdGlvbiAtLSBzZXQgdHlwZSBvZiBzZXJ2aWNlICIpCisgICAgICAgIGFjX2xvZ2dlci5pbmZvKCJTZW5kIHBhY2tldCBtYXRjaGluZyB0aGUgZmxvdywgdmVyaWZ5IHJlY2lldmVkIHBhY2tldCBoYXMgVE9TIHJld3JpdHRlbiAiKQorICAgICAgIAorICAgICAgICAjVmVyaWZ5IHNldF90b3MgaXMgYSBzdXBwb3J0ZWQgYWN0aW9uCisgICAgICAgIHN1cF9hY3RzID0gc3dfc3VwcG9ydGVkX2FjdGlvbnMoc2VsZix1c2VfY2FjaGU9InRydWUiKQorICAgICAgICBpZiBub3QgKHN1cF9hY3RzICYgMSA8PCBvZnAuT0ZQQVRfU0VUX05XX1RPUyk6CisgICAgICAgICAgICBza2lwX21lc3NhZ2VfZW1pdChzZWxmLCAiTW9kaWZ5VE9TIHRlc3QiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgI0NyZWF0ZSBwYWNrZXQgdG8gYmUgc2VudCBhbmQgZXhwZWN0ZWQgcGFja2V0IHdpdGggVE9TIHNldCB0byBzcGVjaWZpZWQgdmFsdWUKKyAgICAgICAgKHBrdCwgZXhwX3BrdCwgYWN0cykgPSBwa3RfYWN0aW9uX3NldHVwKHNlbGYsIG1vZF9maWVsZHM9WydpcF90b3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3Rlc3RfcGFyYW1zPVRydWUpCisgICAgICAgIAorICAgICAgICAjSW5zZXJ0IGZsb3cgd2l0aCBhY3Rpb24gLS0gc2V0IFRPUywgU2VuZCBwYWNrZXQgbWF0Y2hpbmcgdGhlIGZsb3csIFZlcmlmeSByZWNpZXZlZCBwYWNrZXQgaXMgZXhwZWN0ZWQgcGFja2V0CisgICAgICAgIGZsb3dfbWF0Y2hfdGVzdChzZWxmLCBhY19wb3J0X21hcCwgcGt0PXBrdCwgZXhwX3BrdD1leHBfcGt0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9saXN0PWFjdHMsIG1heF90ZXN0PTIsIGVncl9jb3VudD0tMSkKZGlmZiAtLWdpdCBhL3Rlc3RzL0RldGFpbGVkX0NvbnRyX1N3X01lc3NhZ2VzLnB5IGIvdGVzdHMvZGV0YWlsZWRfY29udHJfc3dfbWVzc2FnZXMucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gdGVzdHMvRGV0YWlsZWRfQ29udHJfU3dfTWVzc2FnZXMucHkKcmVuYW1lIHRvIHRlc3RzL2RldGFpbGVkX2NvbnRyX3N3X21lc3NhZ2VzLnB5CmluZGV4IGU1YzFjNTcuLjE1OGY3ODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RldGFpbGVkX0NvbnRyX1N3X01lc3NhZ2VzLnB5CisrKyBiL3Rlc3RzL2RldGFpbGVkX2NvbnRyX3N3X21lc3NhZ2VzLnB5CkBAIC00MCw3ICs0MCw3IEBACiAgICAgY3NfY29uZmlnID0gY29uZmlnCiAKIAotY2xhc3MgT3ZlcmxhcF9DaGVja2luZyhiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgT3ZlcmxhcENoZWNraW5nKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAgICAgCiAgICAgIiIiVmVyaWZ5IHRoYXQgaWYgb3ZlcmxhcCBjaGVjayBmbGFnIGlzIHNldCBpbiB0aGUgZmxvdyBlbnRyeSBhbmQgYW4gb3ZlcmxhcHBpbmcgZmxvdyBpcyBpbnNlcnRlZCB0aGVuIGFuIGVycm9yIAogICAgICAgICBpcyBnZW5lcmF0ZWQgYW5kIHN3aXRjaCByZWZ1c2VzIGZsb3cgZW50cnkiIiIKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBNZXNzYWdlIGNvZGUgaXMgbm90IG92ZXJsYXAnKQogCiAKLWNsYXNzIE5vX092ZXJsYXBfQ2hlY2tpbmcoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKK2NsYXNzIE5vT3ZlcmxhcENoZWNraW5nKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAKICAgICAiIiJWZXJpZnkgdGhhdCB3aXRob3V0IG92ZXJsYXAgY2hlY2sgZmxhZyBzZXQsIG92ZXJsYXBwaW5nIGZsb3dzIGNhbiBiZSBjcmVhdGVkLiIiIiAgCiAgICAgCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgVmVyaWZ5X1RhYmxlU3RhdHMoc2VsZixhY3RpdmVfZW50cmllcz0yKQogCiAKLWNsYXNzIElkZW50aWNhbF9GbG93cyhiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgSWRlbnRpY2FsRmxvd3MoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKICAgICAKICAgICAiIiJWZXJpZnkgdGhhdCBhZGRpbmcgdHdvIGlkZW50aWNhbCBmbG93cyBvdmVyd3JpdGVzIHRoZSBleGlzdGluZyBvbmUgYW5kIGNsZWFycyBjb3VudGVycyIiIgogCkBAIC0xNzQsMTMgKzE3NCwxMyBAQAogICAgICAgICBWZXJpZnlfRmxvd1N0YXRzKHNlbGYsbWF0Y2gsYnl0ZV9jb3VudD0wLHBhY2tldF9jb3VudD0wKQogCiAgICAKLWNsYXNzIEVtZXJfRmxvd19XaXRoX1RpbWVvdXQoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOiAKK2NsYXNzIEVtZXJGbG93VGltZW91dChiYXNpYy5TaW1wbGVQcm90b2NvbCk6IAogCiAgICAgIiIiVGltZW91dCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGZvciBlbWVyZ2VuY3kgZmxvd3MiIiIKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogCi0gICAgICAgIGNzX2xvZ2dlci5pbmZvKCJSdW5uaW5nIEVtZXJnZW5jeSBmbG93IHdpdGggdGltZW91dCB2YWx1ZXMgdGVzdCIpCisgICAgICAgIGNzX2xvZ2dlci5pbmZvKCJSdW5uaW5nIEVtZXJnZW5jeV9GbG93X1RpbWVvdXQgdGVzdCIpCiAgICAgICAgIAogICAgICAgICBvZl9wb3J0cyA9IGNzX3BvcnRfbWFwLmtleXMoKQogICAgICAgICBvZl9wb3J0cy5zb3J0KCkKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBNZXNzYWdlIGNvZGUgaXMgbm90IGJhZCBlbWVyZ2VuY3kgdGltZW91dCcpCiAKIAotY2xhc3MgTWlzc2luZ19Nb2RpZnlfQWRkKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBNaXNzaW5nTW9kaWZ5QWRkKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAKICAgICAiIiJJZiBhIG1vZGlmeSBkb2VzIG5vdCBtYXRjaCBhbiBleGlzdGluZyBmbG93LCB0aGUgZmxvdyBnZXRzIGFkZGVkICIiIgogICAgIApAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgICAgIFZlcmlmeV9UYWJsZVN0YXRzKHNlbGYsYWN0aXZlX2VudHJpZXM9MSkKIAogCi1jbGFzcyBNb2RpZnlfQWN0aW9uKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBNb2RpZnlBY3Rpb24oYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKIAogICAgICIiIkEgbW9kaWZpZWQgZmxvdyBwcmVzZXJ2ZXMgY291bnRlcnMiIiIKICAgICAKQEAgLTMwNCw3ICszMDQsNyBAQAogICAgICAgICBWZXJpZnlfRmxvd1N0YXRzKHNlbGYsbWF0Y2gsYnl0ZV9jb3VudD0oMipsZW4oc3RyKHBrdCkpKSxwYWNrZXRfY291bnQ9MikKIAogCi1jbGFzcyBTdHJpY3RfTW9kaWZ5X0FjdGlvbihiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgU3RyaWN0TW9kaWZ5QWN0aW9uKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAKICAgICAiIiJTdHJpY3QgTW9kaWZ5IEZsb3cgYWxzbyBjaGFuZ2VzIGFjdGlvbiBwcmVzZXJ2ZXMgY291bnRlcnMiIiIKIApAQCAtMzQ4LDcgKzM0OCw3IEBACiAgICAgICAgIFZlcmlmeV9GbG93U3RhdHMoc2VsZixtYXRjaCxieXRlX2NvdW50PSgyKmxlbihzdHIocGt0KSkpLHBhY2tldF9jb3VudD0yKQogCiAKLWNsYXNzIERlbGV0ZV9Ob25FeGlzdGluZ19GbG93KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBEZWxldGVOb25leGlzdGluZ0Zsb3coYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKICAgICAKICAgICAiIiJSZXF1ZXN0IGRlbGV0aW9uIG9mIG5vbi1leGlzdGluZyBmbG93IiIiCiAgICAgCkBAIC0zODIsNyArMzgyLDcgQEAKIAogCiAgICAgICAgIAotY2xhc3MgU2VuZF9GbG93X1JlbShiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgU2VuZEZsb3dSZW0oYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKICAgICAKICAgICAiIiJDaGVjayBkZWxldGlvbiBvZiBmbG93cyBoYXBwZW5zIGFuZCBnZW5lcmF0ZXMgbWVzc2FnZXMgYXMgY29uZmlndXJlZC4KICAgICBJZiBTZW5kIEZsb3cgcmVtb3ZlZCBtZXNzYWdlIEZsYWcgaXMgc2V0IGluIHRoZSBmbG93IGVudHJ5LCB0aGUgZmxvdyBkZWxldGlvbiBvZiB0aGF0IHJlc3BlY3RpdmUgZmxvdyBzaG91bGQgZ2VuZXJhdGUgdGhlIGZsb3cgcmVtb3ZlZCBtZXNzYWdlLCAKQEAgLTM5MCw3ICszOTAsNyBAQAogCiAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CiAKLSAgICAgICAgY3NfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgU2VuZCBGbG93IHJlbW92ZWQgbWVzc2FnZSB0ZXN0IGJlZ2lucyIpCisgICAgICAgIGNzX2xvZ2dlci5pbmZvKCJSdW5uaW5nIFNlbmRfRmxvd19SZW0gdGVzdCAiKQogCiAgICAgICAgIG9mX3BvcnRzID0gY3NfcG9ydF9tYXAua2V5cygpCiAgICAgICAgIG9mX3BvcnRzLnNvcnQoKQpAQCAtNDQzLDE0ICs0NDMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICdEaWQgbm90IHJlY2VpdmUgZmxvdyByZW1vdmVkIG1lc3NhZ2UgZm9yIHRoaXMgZmxvdycpCiAKIAotY2xhc3MgRGVsZXRlX0VtZXJfRmxvdyhiYXNpYy5TaW1wbGVQcm90b2NvbCk6CitjbGFzcyBEZWxldGVFbWVyRmxvdyhiYXNpYy5TaW1wbGVQcm90b2NvbCk6CiAKICAgICAiIiJEZWxldGUgZW1lcmdlbmN5IGZsb3cgYW5kIHZlcmlmeSBubyBtZXNzYWdlIGlzIGdlbmVyYXRlZC5BbiBlbWVyZ2VuY3kgZmxvdyBkZWxldGlvbiB3aWxsIG5vdCBnZW5lcmF0ZSBmbG93LXJlbW92ZWQgbWVzc2FnZXMgZXZlbiBpZiAKICAgICBTZW5kIEZsb3cgcmVtb3ZlZCBtZXNzYWdlIGZsYWcgd2FzIHNldCBkdXJpbmcgdGhlIGVtZXJnZW5jeSBmbG93IGVudHJ5IiIiCiAKICAgICBkZWYgcnVuVGVzdChzZWxmKToKIAotICAgICAgICBjc19sb2dnZXIuaW5mbygiUnVubmluZyBEZWxldGUgRW1lcmdlbmN5IGZsb3ciKQorICAgICAgICBjc19sb2dnZXIuaW5mbygiUnVubmluZyBEZWxldGVfRW1lcl9GbG93IikKIAogICAgICAgICBvZl9wb3J0cyA9IGNzX3BvcnRfbWFwLmtleXMoKQogICAgICAgICBvZl9wb3J0cy5zb3J0KCkKQEAgLTQ4NiwxNCArNDg2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBGYWlsZWQgJykKIAogCi1jbGFzcyBEZWxldGVfU3RyaWN0X05vblN0cmljdChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgU3RyaWN0VnNOb25zdHJpY3QoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKIAogICAgICIiIkRlbGV0ZSBhbmQgdmVyaWZ5IHN0cmljdCBhbmQgbm9uLXN0cmljdCBiZWhhdmlvcnMKICAgICBUaGlzIHRlc3QgY29tcGFyZXMgdGhlIGJlaGF2aW9yIG9mIGRlbGV0ZSBzdHJpY3QgYW5kIG5vbi1zdHJpY3QiIiIKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogICAgICAgICAKLSAgICAgICAgY3NfbG9nZ2VyLmluZm8oIkRlbGV0ZV9TdHJpY3RfTm9uU3RyaWN0IHRlc3QgYmVnaW5zIikKKyAgICAgICAgY3NfbG9nZ2VyLmluZm8oIlN0cmljdF9Wc19Ob25zdHJpY3QgdGVzdCBiZWdpbnMiKQogICAgICAgICAKICAgICAgICAgb2ZfcG9ydHMgPSBjc19wb3J0X21hcC5rZXlzKCkKICAgICAgICAgb2ZfcG9ydHMuc29ydCgpCkBAIC01NzMsMTQgKzU3MywxNCBAQAogCiAgICAgICAgIAogICAgCi1jbGFzcyBEZWxldGVfV2l0aF9PdXRwb3J0KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBPdXRwb3J0MShiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgogCiAgICAgIiIiRGVsZXRlIGZsb3dzIGZpbHRlcmVkIGJ5IGFjdGlvbiBvdXRwb3J0LklmIHRoZSBvdXRfcG9ydCBmaWVsZCBpbiB0aGUgZGVsZXRlIGNvbW1hbmQgY29udGFpbnMgYSB2YWx1ZSBvdGhlciB0aGFuIE9GUFBfTk9ORSwKICAgICBpdCBpbnRyb2R1Y2VzIGEgY29uc3RyYWludCB3aGVuIG1hdGNoaW5nLiBUaGlzIGNvbnN0cmFpbnQgaXMgdGhhdCB0aGUgcnVsZSBtdXN0IGNvbnRhaW4gYW4gb3V0cHV0IGFjdGlvbiBkaXJlY3RlZCBhdCB0aGF0IHBvcnQuIiIiCiAKICAgICBkZWYgcnVuVGVzdChzZWxmKToKICAgICAgICAgCi0gICAgICAgIGNzX2xvZ2dlci5pbmZvKCJEZWxldGVfRmlsdGVyX091dHBvcnQgdGVzdCBiZWdpbnMiKQorICAgICAgICBjc19sb2dnZXIuaW5mbygiT3V0cG9ydDEgdGVzdCBiZWdpbnMiKQogCiAgICAgICAgIG9mX3BvcnRzID0gY3NfcG9ydF9tYXAua2V5cygpCiAgICAgICAgIG9mX3BvcnRzLnNvcnQoKQpAQCAtNjMyLDcgKzYzMiw3IEBACiAgICAgICAgIFZlcmlmeV9UYWJsZVN0YXRzKHNlbGYsYWN0aXZlX2VudHJpZXM9MCkKIAogCi1jbGFzcyBJZGxlX1RpbWVvdXQoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKK2NsYXNzIElkbGVUaW1lb3V0KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAKICAgICAiIiIgVmVyaWZ5IHRoYXQgaWRsZSB0aW1lb3V0IGlzIGltcGxlbWVudGVkIiIiCiAKQEAgLTY3NiwxMyArNjc2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Zsb3cgd2FzIG5vdCBhbGl2ZSBmb3IgMSBzZWMnKQogCiAKLWNsYXNzIEFkZF9Nb2RpZnlfV2l0aF9PdXRwb3J0KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBPdXRwb3J0MihiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgogCiAgICAgIiIiQWRkLCBtb2RpZnkgZmxvd3Mgd2l0aCBvdXRwb3J0IHNldC4gVGhpcyBmaWVsZCBpcyBpZ25vcmVkIGJ5IEFERCwgTU9ESUZZLCBhbmQgTU9ESUZZIFNUUklDVCBtZXNzYWdlcy4iIiIKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogICAgICAgICAKLSAgICAgICAgY3NfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgQWRkX01vZGlmeV9XaXRoX091dHBvcnQgIikKKyAgICAgICAgY3NfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgT3V0cG9ydDIgdGVzdCAiKQogCiAgICAgICAgIG9mX3BvcnRzID0gY3NfcG9ydF9tYXAua2V5cygpCiAgICAgICAgIG9mX3BvcnRzLnNvcnQoKQpAQCAtNzE2LDEzICs3MTYsMTMgQEAKIAogCiAKLWNsYXNzIEhhcmRfVGltZW91dChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgSGFyZFRpbWVvdXQoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKIAogICAgICIiIiBWZXJpZnkgdGhhdCBoYXJkIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgIiIiCiAKICAgICBkZWYgcnVuVGVzdChzZWxmKToKIAotICAgICAgICBjc19sb2dnZXIuaW5mbygiUnVubmluZyBJZGxlX1RpbWVvdXQgdGVzdCAiKQorICAgICAgICBjc19sb2dnZXIuaW5mbygiUnVubmluZyBIYXJkX1RpbWVvdXQgdGVzdCAiKQogICAgICAgICAKICAgICAgICAgb2ZfcG9ydHMgPSBjc19wb3J0X21hcC5rZXlzKCkKICAgICAgICAgb2ZfcG9ydHMuc29ydCgpCkBAIC03NjAsNyArNzYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAnRmxvdyB3YXMgbm90IGFsaXZlIGZvciAxIHNlYycpCiAKIAotY2xhc3MgRmxvd19UaW1lb3V0KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CitjbGFzcyBGbG93VGltZW91dChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgogICAKICAgICAiIiJWZXJpZnkgdGhhdCBGbG93IHJlbW92ZWQgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZCBhcyBleHBlY3RlZAogICAgIEZsb3cgcmVtb3ZlZCBtZXNzYWdlcyBiZWluZyBnZW5lcmF0ZWQgd2hlbiBmbGFnIGlzIHNldCwgaXMgYWxyZWFkeSB0ZXN0ZWQgaW4gdGhlIGFib3ZlIHRlc3RzIApkaWZmIC0tZ2l0IGEvdGVzdHMvT3BlbmZsb3dfUHJvdG9jb2xfTWVzc2FnZXMucHkgYi90ZXN0cy9vcGVuZmxvd19wcm90b2NvbF9tZXNzYWdlcy5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0ZXN0cy9PcGVuZmxvd19Qcm90b2NvbF9NZXNzYWdlcy5weQpyZW5hbWUgdG8gdGVzdHMvb3BlbmZsb3dfcHJvdG9jb2xfbWVzc2FnZXMucHkKaW5kZXggZDNkYjNiMS4uOGYyNTkzZiAxMDA2NDQKLS0tIGEvdGVzdHMvT3BlbmZsb3dfUHJvdG9jb2xfTWVzc2FnZXMucHkKKysrIGIvdGVzdHMvb3BlbmZsb3dfcHJvdG9jb2xfbWVzc2FnZXMucHkKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBvZl9jb25maWcgPSBjb25maWcKIAogCi1jbGFzcyBGZWF0dXJlc19SZXF1ZXN0KGJhc2ljLlNpbXBsZVByb3RvY29sKTogCitjbGFzcyBGZWF0dXJlc1JlcXVlc3QoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOiAKIAogICAgICIiIlZlcmlmeSBGZWF0dXJlc19SZXF1ZXN0LVJlcGx5IGlzIGltcGxlbWVudGVkIAogICAgIGEpIFNlbmQgT0ZQVF9GRUFUVVJFU19SRVFVRVNUCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAnRGlkIG5vdCByZWNlaXZlIEZlYXR1cmVzIFJlcGx5JykKIAogCi1jbGFzcyBDb25maWd1cmF0aW9uX1JlcXVlc3QoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOgorY2xhc3MgQ29uZmlndXJhdGlvblJlcXVlc3QoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOgogICAgIAogICAgICIiIkNoZWNrIGJhc2ljIEdldCBDb25maWcgcmVxdWVzdCBpcyBpbXBsZW1lbnRlZAogICAgIGEpIFNlbmQgT0ZQVF9HRVRfQ09ORklHX1JFUVVFU1QKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcG9uc2UgaXMgbm90IE5vbmUsIAogICAgICAgICAgICAgICAgICAgICAgICAgJ0RpZCBub3QgcmVjZWl2ZSBPRlBUX0dFVF9DT05GSUdfUkVQTFknKQogCi1jbGFzcyBNb2RpZnlfU3RhdGVfQWRkKGJhc2ljLlNpbXBsZVByb3RvY29sKToKK2NsYXNzIE1vZGlmeVN0YXRlQWRkKGJhc2ljLlNpbXBsZVByb3RvY29sKToKICAgICAKICAgICAiIiJDaGVjayBiYXNpYyBGbG93IEFkZCByZXF1ZXN0IGlzIGltcGxlbWVudGVkCiAgICAgYSkgU2VuZCAgT0ZQVF9GTE9XX01PRCAsIGNvbW1hbmQgPSBPRlBGQ19BREQgCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgVmVyaWZ5X1RhYmxlU3RhdHMoc2VsZixhY3RpdmVfZW50cmllcz0xKQogCiAKLWNsYXNzIE1vZGlmeV9TdGF0ZV9EZWxldGUoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOgorY2xhc3MgTW9kaWZ5U3RhdGVEZWxldGUoYmFzaWMuU2ltcGxlUHJvdG9jb2wpOgogICAgIAogICAgICIiIkNoZWNrIEJhc2ljIEZsb3cgRGVsZXRlIHJlcXVlc3QgaXMgaW1wbGVtZW50ZWQKICAgICBhKSBTZW5kIE9GUFRfRkxPV19NT0QsIGNvbW1hbmQgPSBPRlBGQ19BREQKQEAgLTE2Myw3ICsxNjMsNyBAQAogCiAgICAgICAKIAotY2xhc3MgTW9kaWZ5X1N0YXRlX01vZGlmeShiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgTW9kaWZ5U3RhdGVNb2RpZnkoYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKICAgICAKICAgICAiIiJWZXJpZnkgYmFzaWMgRmxvdyBNb2RpZnkgcmVxdWVzdCBpcyBpbXBsZW1lbnRlZAogICAgIGEpIFNlbmQgT0ZQVF9GTE9XX01PRCwgY29tbWFuZCA9IE9GUEZDX0FERCwgQWN0aW9uIEEgCkBAIC0xNzIsNyArMTcyLDcgQEAKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogCi0gICAgICAgIG9mX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE1vZGlmeV9TdGF0ZV9tb2RpZnkgdGVzdCIpCisgICAgICAgIG9mX2xvZ2dlci5pbmZvKCJSdW5uaW5nIE1vZGlmeV9TdGF0ZV9Nb2RpZnkgdGVzdCIpCiAKICAgICAgICAgb2ZfcG9ydHMgPSBvZl9wb3J0X21hcC5rZXlzKCkKICAgICAgICAgb2ZfcG9ydHMuc29ydCgpCkBAIC0xOTEsMTAgKzE5MSwxMCBAQAogICAgICAgICBNb2RpZnlfRmxvd19BY3Rpb24oc2VsZixvZl9wb3J0cyxtYXRjaCkKICAgICAgICAgCiAgICAgICAgICMgU2VuZCB0aGUgVGVzdCBQYWNrZXQgYW5kIHZlcmlmeSBhY3Rpb24gaW1wbGVtZW50ZWQgaXMgQScgKG91dHB1dCB0byBvZl9wb3J0WzJdKQotICAgICAgICBTZW5kUGFja2V0KHNlbGYsIHBrdCwgb2ZfcG9ydHNbMF0sb2ZfcG9ydHNbMl0pCisgICAgICAgIFNlbmRQYWNrZXQoc2VsZixwa3Qsb2ZfcG9ydHNbMF0sb2ZfcG9ydHNbMl0pCiAgICAgICAgICAgICAgICAgICAgICAgIAogCi1jbGFzcyBSZWFkX1N0YXRlKGJhc2ljLlNpbXBsZVByb3RvY29sKToKK2NsYXNzIFJlYWRTdGF0ZShiYXNpYy5TaW1wbGVQcm90b2NvbCk6CiAgICAgCiAgICAgIiIiVGVzdCB0aGF0IGEgYmFzaWMgUmVhZCBzdGF0ZSByZXF1ZXN0IChsaWtlIGZsb3dfc3RhdHNfZ2V0IHJlcXVlc3QpIGRvZXMgbm90IGdlbmVyYXRlIGFuIGVycm9yCiAgICAgYSkgU2VuZCBPRlBUX0ZMT1dfTU9ELCBjb21tYW5kID0gT0ZQRkNfQURECkBAIC0yMjEsNyArMjIxLDcgQEAKICAgICAgICAgI1ZlcmlmeSBGbG93X1N0YXRzIHJlcXVlc3QgZG9lcyBub3QgZ2VuZXJhdGUgZXJyb3JzCiAgICAgICAgIFZlcmlmeV9GbG93U3RhdHMoc2VsZixtYXRjaCkKICAgICAgICAgCi1jbGFzcyBTZW5kX1BhY2tldChiYXNpYy5TaW1wbGVEYXRhUGxhbmUpOgorY2xhc3MgUGFja2V0T3V0KGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAgICAgCiAgICAgIiIiVGVzdCBwYWNrZXQgb3V0IGZ1bmN0aW9uCiAgICAgYSkgU2VuZCBwYWNrZXQgb3V0IG1lc3NhZ2UgZm9yIGVhY2ggZGF0YXBsYW5lIHBvcnQuCkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAKICAgICBkZWYgcnVuVGVzdChzZWxmKToKIAotICAgICAgICBvZl9sb2dnZXIuaW5mbygiUnVubmluZyBTZW5kX1BhY2tldCB0ZXN0IikKKyAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgUGFja2V0X091dCB0ZXN0IikKIAogICAgICAgICBvZl9wb3J0cyA9IG9mX3BvcnRfbWFwLmtleXMoKQogICAgICAgICBvZl9wb3J0cy5zb3J0KCkKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc3BvbnNlIHBhY2tldCBkb2VzIG5vdCBtYXRjaCBzZW5kIHBhY2tldCcpCiAKICAgICAgICAgCi1jbGFzcyBQYWNrZXRfSW4oYmFzaWMuU2ltcGxlRGF0YVBsYW5lKToKK2NsYXNzIFBhY2tldEluKGJhc2ljLlNpbXBsZURhdGFQbGFuZSk6CiAgICAgCiAgICAgIiIiVGVzdCBiYXNpYyBwYWNrZXRfaW4gZnVuY3Rpb24KICAgICBhKSBTZW5kIGEgc2ltcGxlIHRjcCBwYWNrZXQgdG8gYSBkYXRhcGxhbmUgcG9ydCwgd2l0aG91dCBhbnkgZmxvdy1lbnRyeSAKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogCi0gICAgICAgIG9mX2xvZ2dlci5pbmZvKCJSdW5uaW5nIEVjaG9XaXRob3V0Qm9keSB0ZXN0IikKKyAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgRWNob19XaXRob3V0X0JvZHkgdGVzdCIpCiAKICAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIlNlbmRpbmcgRWNobyBSZXF1ZXN0IikKICAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIkV4cGVjdGluZyBhIEVjaG8gUmVwbHkgd2l0aCB2ZXJzaW9uLS0xLjAuMCBhbmQgc2FtZSB4aWQiKQpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAgCiAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CiAKLSAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgQmFycmllclJlcXVlc3RSZXBseSB0ZXN0IikKKyAgICAgICAgb2ZfbG9nZ2VyLmluZm8oIlJ1bm5pbmcgQmFycmllcl9SZXF1ZXN0X1JlcGx5IHRlc3QiKQogCiAgICAgICAgIG9mX2xvZ2dlci5pbmZvKCJTZW5kaW5nIEJhcnJpZXIgUmVxdWVzdCIpCiAgICAgICAgIG9mX2xvZ2dlci5pbmZvKCJFeHBlY3RpbmcgYSBCYXJyaWVyIFJlcGx5IHdpdGggc2FtZSB4aWQiKQo=