IyMjIHVWaXNpb24yIFByb2plY3QsIChDKSBLZWlsIFNvZnR3YXJlDQojIyMgRG8gbm90IG1vZGlmeSAhDQoNClRhcmdldCAoRnJlZVJUT1NfRGVtbyksIDB4MDAwNCAvLyBUb29sczogJ0FSTS1BRFMnDQoNCkdyb3VwIChEZW1vX1NvdXJjZSkNCkdyb3VwIChMaWJyYXJpZXMpDQpHcm91cCAoUlRPU19Tb3VyY2UpDQpHcm91cCAoRG9jdW1lbnRhdGlvbikNCg0KRmlsZSAxLDIsPC5cc3RhcnR1cF9ydm1kay5TPjxzdGFydHVwX3J2bWRrLlM+DQpGaWxlIDEsMSw8LlxMdW1pbmFyeUNvZGVcb3NyYW05NngxNi5jPjxvc3JhbTk2eDE2LmM+DQpGaWxlIDEsMSw8LlxtYWluLmM+PG1haW4uYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxzZW10ZXN0LmM+PHNlbXRlc3QuYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxpbnRlZ2VyLmM+PGludGVnZXIuYz4NCkZpbGUgMSwxLDwuLlxDb21tb25cTWluaW1hbFxQb2xsUS5jPjxQb2xsUS5jPg0KRmlsZSAxLDEsPC4uXENvbW1vblxNaW5pbWFsXEJsb2NrUS5jPjxCbG9ja1EuYz4NCkZpbGUgMSwxLDwuXGhlYXBcaGVhcF8xLmM+PGhlYXBfMS5jPg0KRmlsZSAyLDQsPC4uXENvbW1vblxkcml2ZXJzXEx1bWluYXJ5TWljcm9ca2VpbFxkcml2ZXJsaWIubGliPjxkcml2ZXJsaWIubGliPg0KRmlsZSAzLDEsPC4uXC4uXFNvdXJjZVx0YXNrcy5jPjx0YXNrcy5jPg0KRmlsZSAzLDEsPC4uXC4uXFNvdXJjZVxsaXN0LmM+PGxpc3QuYz4NCkZpbGUgMywxLDwuLlwuLlxTb3VyY2VccXVldWUuYz48cXVldWUuYz4NCkZpbGUgMywxLDwuLlwuLlxTb3VyY2VccG9ydGFibGVcUlZEU1xBUk1fQ00zXHBvcnQuYz48cG9ydC5jPg0KRmlsZSA0LDUsPC5ccmVhZG1lLnR4dD48cmVhZG1lLnR4dD4NCg0KDQpPcHRpb25zIDEsMCwwICAvLyBUYXJnZXQgJ0ZyZWVSVE9TX0RlbW8nDQogRGV2aWNlIChMTTNTODExKQ0KIFZlbmRvciAoTHVtaW5hcnkgTWljcm8pDQogQ3B1IChJUkFNKDB4MjAwMDAwMDAtMHgyMDAwMWZmZikgSVJPTSgwLTB4ZmZmZikgQ0xPQ0soNTAwMDAwMDApIENQVVRZUEUoIkNvcnRleC1NMyIpKQ0KIEZsYXNoVXQgKCkNCiBTdHVwRiAoIlNUQVJUVVBcTHVtaW5hcnlcU3RhcnR1cC5zIiAoIkx1bWluYXJ5IFN0YXJ0dXAgQ29kZSIpKQ0KIEZsYXNoRFIgKExNSURLLUFHREkoLVU0MDI5NjQyMCAtTzcgLVMwIC1DMCAtRk83IC1GRDIwMDAwMDAwIC1GQzgwMCAtRk4xIC1GRjBMTTNTXzggLUZTMDAgLUZMMDIwMDApKQ0KIERldklEICg0MDc5KQ0KIFJnZiAoTE0zU3h4eC5IKQ0KIE1lbSAoKQ0KIEMgKCkNCiBBICgpDQogUkwgKCkNCiBPSCAoKQ0KIERCQ19JRlggKCkNCiBEQkNfQ01TICgpDQogREJDX0FNUyAoKQ0KIERCQ19MTVMgKCkNCiBVc2VFbnY9MA0KIEVudkJpbiAoKQ0KIEVudkluYyAoKQ0KIEVudkxpYiAoKQ0KIEVudlJlZyAo/0x1bWluYXJ5XCkNCiBPcmdSZWcgKP9MdW1pbmFyeVwpDQogVGdTdGF0PTE2DQogT3V0RGlyICguXHJ2bWRrXCkNCiBPdXROYW1lIChSVE9TRGVtbykNCiBHZW5BcHA9MQ0KIEdlbkxpYj0wDQogR2VuSGV4PTANCiBEZWJ1Zz0xDQogQnJvd3NlPTENCiBMc3REaXIgKC5ccnZtZGtcKQ0KIEhleFNlbD0xDQogTUczMks9MA0KIFRHTU9SRT0wDQogUnVuVXNyIDAgMCA8Pg0KIFJ1blVzciAxIDAgPD4NCiBCcnVuVXNyIDAgMCA8Pg0KIEJydW5Vc3IgMSAwIDw+DQogQ3J1blVzciAwIDAgPD4NCiBDcnVuVXNyIDEgMCA8Pg0KIFNWQ1NJRCA8Pg0KIEdMRkxBR1M9MTc5MA0KIEFEU0ZMR0EgeyAxNzYsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9DQogQUNQVVRZUCAoIkNvcnRleC1NMyIpDQogUlZERVYgKCkNCiBBRFNURkxHQSB7IDAsMTIsMCwyLDk5LDAsMCw2NiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9DQogT0NNQURTT0NNIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIE9DTUFEU0lSQU0geyAwLDAsMCwwLDMyLDAsMzIsMCwwIH0NCiBPQ01BRFNJUk9NIHsgMSwwLDAsMCwwLDAsMCwxLDAgfQ0KIE9DTUFEU1hSQU0geyAwLDAsMCwwLDAsMCwwLDAsMCB9DQogT0NSX1JWQ1QgeyAxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMyLDAsMzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBSVl9TVEFWRUMgKCkNCiBBRFNDQ0ZMRyB7IDksMzIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIEFEU0NNSVNDICgpDQogQURTQ0RFRk4gKFJWRFNfQVJNQ00zX0xNM1MxMDIpDQogQURTQ1VERUYgKCkNCiBBRFNDSU5DRCAoLjsuL0x1bWluYXJ5Q29kZTsuLlwuLlxTb3VyY2VccG9ydGFibGVcUlZEU1xBUk1fQ00zOy4uXC4uXFNvdXJjZVxpbmNsdWRlOy4uXENvbW1vblxpbmNsdWRlKQ0KIEFEU0FTRkxHIHsgMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBBRFNBTUlTQyAoKQ0KIEFEU0FERUZOICgpDQogQURTQVVERUYgKCkNCiBBRFNBSU5DRCAoKQ0KIFByb3BGbGQgeyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfQ0KIEluY0JsZD0xDQogQWx3YXlzQnVpbGQ9MA0KIEdlbkFzbT0wDQogQXNtQXNtPTANCiBQdWJsaWNzT25seT0wDQogU3RvcENvZGU9Mw0KIEN1c3RBcmdzICgpDQogTGliTW9kcyAoKQ0KIEFEU0xERkcgeyAxNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBBRFNMRFRBICgweDAwMDAwMDAwKQ0KIEFEU0xEREEgKDB4MjAwMDAwMDApDQogQURTTERTQyAoKQ0KIEFEU0xESUIgKCkNCiBBRFNMRElDICgpDQogQURTTERNQyAoLS1lbnRyeSBSZXNldF9IYW5kbGVyIC0tbGFzdCB4SGVhcCkNCiBBRFNMRElGICgpDQogQURTTEREVyAoKQ0KICBPUFRETCAoU0FSTUNNMy5ETEwpKCkoRExNLkRMTCkoLXBMTTNTODExKShTQVJNQ00zLkRMTCkoKShUTE0uRExMKSgtcExNM1M4MTEpDQogIE9QVERCRyA0ODEyNiw0LCgpKCkoKSgpKCkoKSgpKCkoKSgpIChCSU5cbG1pZGstYWdkaS5kbGwpKCkoKSgpDQogRkxBU0gxIHsgMSwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwIH0NCiBGTEFTSDIgKEJJTlxMTUlESy1BR0RJLkRMTCkNCiBGTEFTSDMgKCIiICgpKQ0KIEZMQVNINCAoKQ0KRW5kT3B0DQoNCg==