ZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0ZjhkZjNlLi4wYmRkMjZlIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zMSw2ICszMSw5IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImNvbS5nb29nbGUuYW5kcm9pZC5nb29nbGVhcHBzLnBlcm1pc3Npb24uR09PR0xFX0FVVEguQUxMX1NFUlZJQ0VTIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5wZXJtaXNzaW9uLkdPT0dMRV9BVVRILllvdVR1YmVVc2VyIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uZ29vZ2xlLmFuZHJvaWQuZ29vZ2xlYXBwcy5wZXJtaXNzaW9uLkFDQ0VTU19HT09HTEVfUEFTU1dPUkQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5HRVRfQUNDT1VOVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VU0VfQ1JFREVOVElBTFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQUNDT1VOVFMiIC8+CiAKICAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iRGV2IFRvb2xzIgogICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfZGV2dG9vbHMiPgpAQCAtNzMsNiArNzYsMTQgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJBY2NvdW50c1Rlc3RlciIgYW5kcm9pZDpsYWJlbD0iQWNjb3VudHNUZXN0ZXIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVEVTVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJEYXRhTGlzdCI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkRldGFpbHMiPgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRfbGlzdF9jb250ZXh0X21lbnUueG1sIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRfbGlzdF9jb250ZXh0X21lbnUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTdjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudF9saXN0X2NvbnRleHRfbWVudS54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IEdvb2dsZSBJbmMuCisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfcmVtb3ZlX2FjY291bnQiIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbiIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW4iIC8+CisKKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9pbnZhbGlkYXRlX2F1dGhfdG9rZW4iCisgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiIgLz4KKworICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX3VwZGF0ZV9jcmVkZW50aWFscyIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfdXBkYXRlX2NyZWRlbnRpYWxzIiAvPgorCisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscyIKKyAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscyIgLz4KKworPC9tZW51PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYWNjb3VudHNfdGVzdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTViMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2FjY291bnRzX3Rlc3Rlci54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hY2NvdW50X3R5cGVzX3NwaW5uZXJfbGFiZWwiCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX3NlbGVjdF9hY2NvdW50X3R5cGUiLz4KKworICAgICAgICAgIDxTcGlubmVyIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FjY291bnRfdHlwZXNfc3Bpbm5lciIKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2F1dGhlbnRpY2F0b3JzX2xpc3QiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiLz4KKworICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUiLz4KKworICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cyIvPgorCisgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FjY291bnRzX3Rlc3Rlcl9hZGRfYWNjb3VudCIvPgorCisgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2VkaXRfcHJvcGVydGllcyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzIi8+CisgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2FjY291bnRzX2xpc3QiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2F1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbS54bWwgYi9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvYXV0aGVudGljYXRvcnNfbGlzdF9pdGVtLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDlhODE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2F1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbS54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRXNtZXJ0ZWMgQUcuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjFkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxZGlwIgorICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjlkaXAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjlkaXAiPgorCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoZW50aWNhdG9yX2ljb24iCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI5ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcl9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Y2VudGVyX3ZlcnRpY2FsIiAvPgorPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9nZXRfYXV0aF90b2tlbl92aWV3LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9nZXRfYXV0aF90b2tlbl92aWV3LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzcxNTIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L2dldF9hdXRoX3Rva2VuX3ZpZXcueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWNjb3VudHNfdGVzdGVyX2dldF9hdXRoX3Rva2VuX2RpYWxvZ19tZXNzYWdlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjb3VudHNfdGVzdGVyX2VudGVyX2F1dGhfdG9rZW5fdHlwZSIgLz4KKworICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2FjY291bnRzX3Rlc3Rlcl9hdXRoX3Rva2VuX3R5cGUiCisgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDptaW5XaWR0aD0iMjUwZGlwIgorICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKKyAgICAgICAgICAgICAgYW5kcm9pZDpjYXBpdGFsaXplPSJub25lIgorICAgICAgICAgICAgICBhbmRyb2lkOmF1dG9UZXh0PSJmYWxzZSIvPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCA0Yzg0NTQ4Li5kM2Y2YWEzIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xMzMsNCArMTMzLDIxIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtX2xpc3RfaGVhZGVyX3RleHQiPkFwcHMgdXNpbmcgcGVybWlzc2lvbiAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzb3VyY2VfdWlkX3RleHQiPlNvdXJjZSB1aWQgOiAgPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzaGFyZWRfcGtnc190ZXh0Ij5QYWNrYWdlcyBhY2Nlc3NpbmcgdmlhIHNoYXJlZCB1aWQgOiAgPC9zdHJpbmc+CisKKyAgICA8IS0tIEFjY291bnRzVGVzdGVyIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2FwcF9uYW1lIj5BY2NvdW50cyBUZXN0ZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9nZXRfYWNjb3VudHNfYnlfdHlwZSI+R2V0IEFjY291bnRzIEJ5IFR5cGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzIj5HZXQgQWxsIEFjY291bnRzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfYWRkX2FjY291bnQiPkFkZCBBY2NvdW50PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfc2VsZWN0X2FjY291bnRfdHlwZSI+U2VsZWN0IEFjY291bnQgVHlwZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX3Byb2Nlc3NfbmFtZV9oZWFkZXIiPlByb2Nlc3MgTmFtZTo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9yZW1vdmVfYWNjb3VudCI+cmVtb3ZlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY2NvdW50c190ZXN0ZXJfZ2V0X2F1dGhfdG9rZW4iPmF1dGhlbnRpY2F0ZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2ludmFsaWRhdGVfYXV0aF90b2tlbiI+aW52YWxpZGF0ZSB0b2tlbjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2FjY291bnRfY29udGV4dF9tZW51X3RpdGxlIj5hY2NvdW50IG9wZXJhdGlvbnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9kb19nZXRfYXV0aF90b2tlbiI+T2s8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9lbnRlcl9hdXRoX3Rva2VuX3R5cGUiPkVudGVyIHRoZSBhdXRodG9rZW4gdHlwZTo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl91cGRhdGVfY3JlZGVudGlhbHMiPlVwZGF0ZSBDcmVkZW50aWFsczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWNjb3VudHNfdGVzdGVyX2NvbmZpcm1fY3JlZGVudGlhbHMiPkNvbmZpcm0gQ3JlZGVudGlhbHM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMiPkVkaXQgUHJvcGVydGllczwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9BY2NvdW50c1Rlc3Rlci5qYXZhIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQWNjb3VudHNUZXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI2YzRjCi0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvQWNjb3VudHNUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDQ0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZGV2ZWxvcG1lbnQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50Lio7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuKjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudmlldy4qOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lio7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50c1Rlc3RlciBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgT25BY2NvdW50c1VwZGF0ZWRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBY2NvdW50c1Rlc3RlciI7CisgICAgcHJpdmF0ZSBTcGlubmVyIG1BY2NvdW50VHlwZXNTcGlubmVyOworICAgIHByaXZhdGUgTGlzdFZpZXcgbUFjY291bnRzTGlzdFZpZXc7CisgICAgcHJpdmF0ZSBMaXN0VmlldyBtQXV0aGVudGljYXRvcnNMaXN0VmlldzsKKyAgICBwcml2YXRlIEFjY291bnRNYW5hZ2VyIG1BY2NvdW50TWFuYWdlcjsKKyAgICBwcml2YXRlIFN0cmluZyBtTG9uZ1ByZXNzZWRBY2NvdW50ID0gbnVsbDsKKyAgICBwcml2YXRlIEZ1dHVyZTFDYWxsYmFjazxBY2NvdW50W10+IG1HZXRBY2NvdW50c0NhbGxiYWNrOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fR09PR0xFX0dBSUEgPSAiY29tLmdvb2dsZS5HQUlBIjsKKyAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdIG1BdXRoZW50aWNhdG9yRGVzY3M7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0NSRURFTlRJQUxTX0RJQUxPR19JRCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQgPSAzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBtQWNjb3VudE1hbmFnZXIgPSBBY2NvdW50TWFuYWdlci5nZXQodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFjY291bnRzX3Rlc3Rlcik7CisgICAgICAgIEJ1dHRvbkNsaWNrTGlzdGVuZXIgYnV0dG9uQ2xpY2tMaXN0ZW5lciA9IG5ldyBCdXR0b25DbGlja0xpc3RlbmVyKCk7CisgICAgICAgIG1HZXRBY2NvdW50c0NhbGxiYWNrID0gbmV3IEZ1dHVyZTFDYWxsYmFjazxBY2NvdW50W10+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTE8QWNjb3VudFtdPiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtR2V0QWNjb3VudHNDYWxsYmFjazogc3RhcnRpbmciKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHMgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIG9uQWNjb3VudHNVcGRhdGVkKGFjY291bnRzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBjYW5jZWxlZAorICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtR2V0QWNjb3VudHNDYWxsYmFjazogcmVxdWVzdCB3YXMgY2FuY2VsZWQiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbUFjY291bnRUeXBlc1NwaW5uZXIgPSAoU3Bpbm5lcikgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FjY291bnRfdHlwZXNfc3Bpbm5lcik7CisgICAgICAgIG1BY2NvdW50c0xpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYWNjb3VudHNfbGlzdCk7CisgICAgICAgIG1BdXRoZW50aWNhdG9yc0xpc3RWaWV3ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcnNfbGlzdCk7CisgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUobUFjY291bnRzTGlzdFZpZXcpOworICAgICAgICBhc3luY0dldEF1dGhlbnRpY2F0b3JUeXBlcygpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FsbF9hY2NvdW50cykuc2V0T25DbGlja0xpc3RlbmVyKGJ1dHRvbkNsaWNrTGlzdGVuZXIpOworICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUpLnNldE9uQ2xpY2tMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50KS5zZXRPbkNsaWNrTGlzdGVuZXIoYnV0dG9uQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmFjY291bnRzX3Rlc3Rlcl9lZGl0X3Byb3BlcnRpZXMpLnNldE9uQ2xpY2tMaXN0ZW5lcihidXR0b25DbGlja0xpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRoZW50aWNhdG9yc0FycmF5QWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24+IHsKKyAgICAgICAgcHJvdGVjdGVkIExheW91dEluZmxhdGVyIG1JbmZsYXRlcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1SZXNvdXJjZSA9IFIubGF5b3V0LmF1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbTsKKworICAgICAgICBwdWJsaWMgQXV0aGVudGljYXRvcnNBcnJheUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb25bXSBpdGVtcykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgbVJlc291cmNlLCBpdGVtcyk7CisgICAgICAgICAgICBtSW5mbGF0ZXIgPSAoTGF5b3V0SW5mbGF0ZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjbGFzcyBWaWV3SG9sZGVyIHsKKyAgICAgICAgICAgIFRleHRWaWV3IGxhYmVsOworICAgICAgICAgICAgSW1hZ2VWaWV3IGljb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIC8vIEEgVmlld0hvbGRlciBrZWVwcyByZWZlcmVuY2VzIHRvIGNoaWxkcmVuIHZpZXdzIHRvIGF2b2lkIHVubmVjY2Vzc2FyeSBjYWxscworICAgICAgICAgICAgLy8gdG8gZmluZFZpZXdCeUlkKCkgb24gZWFjaCByb3cuCisgICAgICAgICAgICBWaWV3SG9sZGVyIGhvbGRlcjsKKworICAgICAgICAgICAgLy8gV2hlbiBjb252ZXJ0VmlldyBpcyBub3QgbnVsbCwgd2UgY2FuIHJldXNlIGl0IGRpcmVjdGx5LCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyB0byByZWluZmxhdGUgaXQuIFdlIG9ubHkgaW5mbGF0ZSBhIG5ldyBWaWV3IHdoZW4gdGhlIGNvbnZlcnRWaWV3IHN1cHBsaWVkCisgICAgICAgICAgICAvLyBieSBMaXN0VmlldyBpcyBudWxsLgorICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0VmlldyA9IG1JbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmF1dGhlbnRpY2F0b3JzX2xpc3RfaXRlbSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGVzIGEgVmlld0hvbGRlciBhbmQgc3RvcmUgcmVmZXJlbmNlcyB0byB0aGUgdHdvIGNoaWxkcmVuIHZpZXdzCisgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBiaW5kIGRhdGEgdG8uCisgICAgICAgICAgICAgICAgaG9sZGVyID0gbmV3IFZpZXdIb2xkZXIoKTsKKyAgICAgICAgICAgICAgICBob2xkZXIubGFiZWwgPSAoVGV4dFZpZXcpIGNvbnZlcnRWaWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuaWQuYWNjb3VudHNfdGVzdGVyX2F1dGhlbnRpY2F0b3JfbGFiZWwpOworICAgICAgICAgICAgICAgIGhvbGRlci5pY29uID0gKEltYWdlVmlldykgY29udmVydFZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aGVudGljYXRvcl9pY29uKTsKKworICAgICAgICAgICAgICAgIGNvbnZlcnRWaWV3LnNldFRhZyhob2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFZpZXdIb2xkZXIgYmFjayB0byBnZXQgZmFzdCBhY2Nlc3MgdG8gdGhlIFRleHRWaWV3CisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBJbWFnZVZpZXcuCisgICAgICAgICAgICAgICAgaG9sZGVyID0gKFZpZXdIb2xkZXIpIGNvbnZlcnRWaWV3LmdldFRhZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24gZGVzYyA9IGdldEl0ZW0ocG9zaXRpb24pOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZGVzYy5wYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBhdXRoQ29udGV4dCA9IGdldENvbnRleHQoKS5jcmVhdGVQYWNrYWdlQ29udGV4dChwYWNrYWdlTmFtZSwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dCBmaWVsZAorICAgICAgICAgICAgICAgIGhvbGRlci5sYWJlbC5zZXRUZXh0KGF1dGhDb250ZXh0LmdldFN0cmluZyhkZXNjLmxhYmVsSWQpKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCByZXNvdXJjZSBpY29uCisgICAgICAgICAgICAgICAgaG9sZGVyLmljb24uc2V0SW1hZ2VEcmF3YWJsZShhdXRoQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShkZXNjLmljb25JZCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlcnJvciBnZXR0aW5nIHRoZSBQYWNrYWdlIENvbnRleHQgZm9yICIgKyBwYWNrYWdlTmFtZSwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VmlldzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3luY0dldEF1dGhlbnRpY2F0b3JUeXBlcygpIHsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLmdldEF1dGhlbnRpY2F0b3JUeXBlcyhuZXcgR2V0QXV0aGVudGljYXRvcnNDYWxsYmFjaygpLCBudWxsIC8qIGhhbmRsZXIgKi8pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgeworICAgICAgICBMb2cuZChUQUcsICJvbkFjY291bnRzVXBkYXRlZDogXG4gICIgKyBUZXh0VXRpbHMuam9pbigiXG4gICIsIGFjY291bnRzKSk7CisgICAgICAgIFN0cmluZ1tdIGFjY291bnROYW1lcyA9IG5ldyBTdHJpbmdbYWNjb3VudHMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NvdW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYWNjb3VudE5hbWVzW2ldID0gYWNjb3VudHNbaV0ubU5hbWU7CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlciA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIGFjY291bnROYW1lcyk7CisgICAgICAgIG1BY2NvdW50c0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBmaW5hbCBIYW5kbGVyIG1haW5IYW5kbGVyID0gbmV3IEhhbmRsZXIoZ2V0TWFpbkxvb3BlcigpKTsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLmFkZE9uQWNjb3VudHNVcGRhdGVkTGlzdGVuZXIodGhpcywgbWFpbkhhbmRsZXIsCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiB1cGRhdGVJbW1lZGlhdGVseSAqLyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICAgICAgbUFjY291bnRNYW5hZ2VyLnJlbW92ZU9uQWNjb3VudHNVcGRhdGVkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgY2xhc3MgQnV0dG9uQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGlmIChSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYWxsX2FjY291bnRzID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBY2NvdW50cyhtR2V0QWNjb3VudHNDYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfZ2V0X2FjY291bnRzX2J5X3R5cGUgPT0gdi5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlOworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBY2NvdW50c0J5VHlwZShtR2V0QWNjb3VudHNDYWxsYmFjaywgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFIuaWQuYWNjb3VudHNfdGVzdGVyX2FkZF9hY2NvdW50ID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIEZ1dHVyZTJDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBGdXR1cmUyQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhY2NvdW50IGFkZGVkOiAiICsgYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRBY2NvdW50IHdhcyBjYW5jZWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImFkZEFjY291bnQgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZGRBY2NvdW50IGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuYWRkQWNjb3VudChnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBhdXRoVG9rZW5UeXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiByZXF1aXJlZEZlYXR1cmVzICovLCBudWxsIC8qIG9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBjYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoUi5pZC5hY2NvdW50c190ZXN0ZXJfZWRpdF9wcm9wZXJ0aWVzID09IHYuZ2V0SWQoKSkgeworICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5lZGl0UHJvcGVydGllcyhnZXRTZWxlY3RlZEF1dGhlbnRpY2F0b3IoKS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudHNUZXN0ZXIudGhpcywgbmV3IEVkaXRQcm9wZXJ0aWVzQ2FsbGJhY2soKSwgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdW5rbm93biBidXR0b24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgRWRpdFByb3BlcnRpZXNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICBidW5kbGUua2V5U2V0KCk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIHN1Y2NlZWRlZDogIiArIGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJlZGl0UHJvcGVydGllcyB3YXMgY2FuY2VsZWQiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIGZhaWxlZDogIiwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVkaXRQcm9wZXJ0aWVzIGZhaWxlZDogIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24gZ2V0U2VsZWN0ZWRBdXRoZW50aWNhdG9yKCkgeworICAgICAgICByZXR1cm4gbUF1dGhlbnRpY2F0b3JEZXNjc1ttQWNjb3VudFR5cGVzU3Bpbm5lci5nZXRTZWxlY3RlZEl0ZW1Qb3NpdGlvbigpXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwKKyAgICAgICAgICAgIENvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbyBtZW51SW5mbykgeworICAgICAgICBtZW51LnNldEhlYWRlclRpdGxlKFIuc3RyaW5nLmFjY291bnRzX3Rlc3Rlcl9hY2NvdW50X2NvbnRleHRfbWVudV90aXRsZSk7CisKKyAgICAgICAgQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbyBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pbWVudUluZm87CisKKyAgICAgICAgTWVudUluZmxhdGVyIGluZmxhdGVyID0gZ2V0TWVudUluZmxhdGVyKCk7CisgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWNjb3VudF9saXN0X2NvbnRleHRfbWVudSwgbWVudSk7CisgICAgICAgIG1Mb25nUHJlc3NlZEFjY291bnQgPSAoKFRleHRWaWV3KWluZm8udGFyZ2V0VmlldykuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfcmVtb3ZlX2FjY291bnQpIHsKKyAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5yZW1vdmVBY2NvdW50KG51bGwgLyogY2FsbGJhY2sgKi8sIG5ldyBBY2NvdW50KG1Mb25nUHJlc3NlZEFjY291bnQsCisgICAgICAgICAgICAgICAgICAgIENPTV9HT09HTEVfR0FJQSksIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5nZXRJdGVtSWQoKSA9PSBSLmlkLmFjY291bnRzX3Rlc3Rlcl9nZXRfYXV0aF90b2tlbikgeworICAgICAgICAgICAgc2hvd0RpYWxvZyhHRVRfQVVUSF9UT0tFTl9ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfaW52YWxpZGF0ZV9hdXRoX3Rva2VuKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nKElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfdXBkYXRlX2NyZWRlbnRpYWxzKSB7CisgICAgICAgICAgICBzaG93RGlhbG9nKFVQREFURV9DUkVERU5USUFMU19ESUFMT0dfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZ2V0SXRlbUlkKCkgPT0gUi5pZC5hY2NvdW50c190ZXN0ZXJfY29uZmlybV9jcmVkZW50aWFscykgeworICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmNvbmZpcm1DcmVkZW50aWFscyhuZXcgQWNjb3VudChtTG9uZ1ByZXNzZWRBY2NvdW50LCBDT01fR09PR0xFX0dBSUEpLAorICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBuZXcgQ29uZmlybUNyZWRlbnRpYWxzQ2FsbGJhY2soKSwgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKGZpbmFsIGludCBpZCkgeworICAgICAgICBpZiAoaWQgPT0gR0VUX0FVVEhfVE9LRU5fRElBTE9HX0lEIHx8IGlkID09IElOVkFMSURBVEVfQVVUSF9UT0tFTl9ESUFMT0dfSUQKKyAgICAgICAgICAgICAgICB8fCBpZCA9PSBVUERBVEVfQ1JFREVOVElBTFNfRElBTE9HX0lEKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSBMYXlvdXRJbmZsYXRlci5mcm9tKHRoaXMpLmluZmxhdGUoUi5sYXlvdXQuZ2V0X2F1dGhfdG9rZW5fdmlldywgbnVsbCk7CisgICAgICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWNjb3VudHNfdGVzdGVyX2RvX2dldF9hdXRoX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFRleHQgdmFsdWUgPSAoRWRpdFRleHQpIHZpZXcuZmluZFZpZXdCeUlkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5pZC5hY2NvdW50c190ZXN0ZXJfYXV0aF90b2tlbl90eXBlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW5UeXBlID0gdmFsdWUuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnV0dXJlMkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEZ1dHVyZTJDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEZ1dHVyZTIgZnV0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmtleVNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpYWxvZyAiICsgaWQgKyAiIHN1Y2Nlc3M6ICIgKyBidW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImRpYWxvZyAiICsgaWQgKyAiIGNhbmNlbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZGlhbG9nICIgKyBpZCArICIgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJkaWFsb2cgIiArIGlkICsgIiBmYWlsZWQ6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gbmV3IEFjY291bnQobUxvbmdQcmVzc2VkQWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTV9HT09HTEVfR0FJQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IEdFVF9BVVRIX1RPS0VOX0RJQUxPR19JRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuZ2V0QXV0aFRva2VuKGFjY291bnQsIGF1dGhUb2tlblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBsb2dpbk9wdGlvbnMgKi8sIEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2ssIG51bGwgLyogaGFuZGxlciAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PSBJTlZBTElEQVRFX0FVVEhfVE9LRU5fRElBTE9HX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5nZXRBdXRoVG9rZW4oYWNjb3VudCwgYXV0aFRva2VuVHlwZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdldEFuZEludmFsaWRhdGVBdXRoVG9rZW5DYWxsYmFjaygpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIudXBkYXRlQ3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVG9rZW5UeXBlLCBudWxsIC8qIGxvZ2luT3B0aW9ucyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBjYWxsYmFjaywgbnVsbCAvKiBoYW5kbGVyICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0Vmlldyh2aWV3KTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5vbkNyZWF0ZURpYWxvZyhpZCk7CisgICAgfQorCisgICAgRnV0dXJlMkNhbGxiYWNrIG5ld0FjY291bnRzQ2FsbGJhY2soU3RyaW5nIHR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgR2V0QWNjb3VudHNDYWxsYmFjayh0eXBlLCBmZWF0dXJlcyk7CisgICAgfQorCisgICAgY2xhc3MgR2V0QWNjb3VudHNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1GZWF0dXJlczsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1BY2NvdW50VHlwZTsKKworICAgICAgICBwdWJsaWMgR2V0QWNjb3VudHNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgICAgIG1GZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAgICAgICAgbUFjY291bnRUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiR2V0QWNjb3VudHNDYWxsYmFjazogdHlwZSAiICsgbUFjY291bnRUeXBlCisgICAgICAgICAgICAgICAgICAgICsgIiwgZmVhdHVyZXMgIgorICAgICAgICAgICAgICAgICAgICArIChtRmVhdHVyZXMgPT0gbnVsbCA/ICJub25lIiA6IFRleHRVdGlscy5qb2luKCIsIiwgbUZlYXR1cmVzKSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIFBhcmNlbGFibGVbXSBhY2NvdW50cyA9IHJlc3VsdC5nZXRQYXJjZWxhYmxlQXJyYXkoQ29uc3RhbnRzLkFDQ09VTlRTX0tFWSk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZm91bmQgIiArIGFjY291bnRzLmxlbmd0aCArICIgYWNjb3VudHMiKTsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcmNlbGFibGUgYWNjb3VudCA6IGFjY291bnRzKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiAgIiArIGFjY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbHVyZSIsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQXV0aGVudGljYXRvckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZmFpbHVyZSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgRnV0dXJlMkNhbGxiYWNrIG5ld0F1dGhUb2tlbnNDYWxsYmFjayhTdHJpbmcgdHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgICAgIHJldHVybiBuZXcgR2V0QXV0aFRva2VuQ2FsbGJhY2sodHlwZSwgYXV0aFRva2VuVHlwZSwgZmVhdHVyZXMpOworICAgIH0KKworICAgIGNsYXNzIEdldEF1dGhUb2tlbkNhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMkNhbGxiYWNrIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gbUZlYXR1cmVzOworICAgICAgICBmaW5hbCBTdHJpbmcgbUFjY291bnRUeXBlOworICAgICAgICBmaW5hbCBTdHJpbmcgbUF1dGhUb2tlblR5cGU7CisKKyAgICAgICAgcHVibGljIEdldEF1dGhUb2tlbkNhbGxiYWNrKFN0cmluZyB0eXBlLCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgU3RyaW5nW10gZmVhdHVyZXMpIHsKKyAgICAgICAgICAgIG1GZWF0dXJlcyA9IGZlYXR1cmVzOworICAgICAgICAgICAgbUFjY291bnRUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIG1BdXRoVG9rZW5UeXBlID0gYXV0aFRva2VuVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiR2V0QXV0aFRva2VuQ2FsbGJhY2s6IHR5cGUgIiArIG1BY2NvdW50VHlwZQorICAgICAgICAgICAgICAgICAgICArICIsIGZlYXR1cmVzICIKKyAgICAgICAgICAgICAgICAgICAgKyAobUZlYXR1cmVzID09IG51bGwgPyAibm9uZSIgOiBUZXh0VXRpbHMuam9pbigiLCIsIG1GZWF0dXJlcykpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQnVuZGxlIHJlc3VsdCA9IGZ1dHVyZS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQua2V5U2V0KCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICByZXN1bHQ6ICIgKyByZXN1bHQpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImZhaWx1cmUiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJmYWlsdXJlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEdldEFuZEludmFsaWRhdGVBdXRoVG9rZW5DYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW4gPSBidW5kbGUuZ2V0U3RyaW5nKENvbnN0YW50cy5BVVRIVE9LRU5fS0VZKTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihuZXcgRnV0dXJlMUNhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oRnV0dXJlMTxWb2lkPiBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHdhcyBjYW5jZWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwgQ09NX0dPT0dMRV9HQUlBLCBhdXRoVG9rZW4sIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImludmFsaWRhdGU6IGludGVycnVwdGVkIHdoaWxlIGdldHRpbmcgYXV0aFRva2VuIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW52YWxpZGF0ZTogZXJyb3IgZ2V0dGluZyBhdXRoVG9rZW4iLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImludmFsaWRhdGU6IGVycm9yIGdldHRpbmcgYXV0aFRva2VuIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maXJtQ3JlZGVudGlhbHNDYWxsYmFjayBpbXBsZW1lbnRzIEZ1dHVyZTJDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUyIGZ1dHVyZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gZnV0dXJlLmdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgc3VjY2VzczogIiArIGJ1bmRsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlybUNyZWRlbnRpYWxzIGNhbmNlbGVkIik7CisgICAgICAgICAgICB9IGNhdGNoIChBdXRoZW50aWNhdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjb25maXJtQ3JlZGVudGlhbHMgZmFpbGVkOiAiICsgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY29uZmlybUNyZWRlbnRpYWxzIGZhaWxlZDogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBHZXRBdXRoZW50aWNhdG9yc0NhbGxiYWNrIGltcGxlbWVudHMgRnV0dXJlMUNhbGxiYWNrPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdPiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihGdXR1cmUxPEF1dGhlbnRpY2F0b3JEZXNjcmlwdGlvbltdPiBmdXR1cmUpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpbmlzaGluZygpKSByZXR1cm47CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1BdXRoZW50aWNhdG9yRGVzY3MgPSBmdXR1cmUuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW21BdXRoZW50aWNhdG9yRGVzY3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1BdXRoZW50aWNhdG9yRGVzY3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dCBhdXRoQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhDb250ZXh0ID0gY3JlYXRlUGFja2FnZUNvbnRleHQobUF1dGhlbnRpY2F0b3JEZXNjc1tpXS5wYWNrYWdlTmFtZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuYW1lc1tpXSA9IGF1dGhDb250ZXh0LmdldFN0cmluZyhtQXV0aGVudGljYXRvckRlc2NzW2ldLmxhYmVsSWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KEFjY291bnRzVGVzdGVyLnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG5hbWVzKTsKKyAgICAgICAgICAgICAgICBtQWNjb3VudFR5cGVzU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworCisgICAgICAgICAgICAgICAgbUF1dGhlbnRpY2F0b3JzTGlzdFZpZXcuc2V0QWRhcHRlcihuZXcgQXV0aGVudGljYXRvcnNBcnJheUFkYXB0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50c1Rlc3Rlci50aGlzLCBtQXV0aGVudGljYXRvckRlc2NzKSk7CisgICAgICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9Qb2ludGVyTG9jYXRpb24uamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCmluZGV4IDY2OGU5YmEuLjQxOWUyZTQgMTAwNjQ0Ci0tLSBhL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCisrKyBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L1BvaW50ZXJMb2NhdGlvbi5qYXZhCkBAIC00NywxNiArNDcsOSBAQAogICAgICAgICBnZXRXaW5kb3coKS5zZXRBdHRyaWJ1dGVzKGxwKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIGNsYXNzIE15VmlldyBleHRlbmRzIFZpZXcgewotICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1UZXh0UGFpbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRleHRCYWNrZ3JvdW5kUGFpbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRleHRMZXZlbFBhaW50OwotICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1QYWludDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtVGFyZ2V0UGFpbnQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRm9udE1ldHJpY3NJbnQgbVRleHRNZXRyaWNzID0gbmV3IEZvbnRNZXRyaWNzSW50KCk7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2ludGVyU3RhdGUgewogICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxGbG9hdD4gbVhzID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8RmxvYXQ+IG1ZcyA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1IZWFkZXJCb3R0b207CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ3VyRG93bjsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUN1clg7CiAgICAgICAgIHByaXZhdGUgaW50IG1DdXJZOwpAQCAtNjQsMTIgKzU3LDI3IEBACiAgICAgICAgIHByaXZhdGUgZmxvYXQgbUN1clNpemU7CiAgICAgICAgIHByaXZhdGUgaW50IG1DdXJXaWR0aDsKICAgICAgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5OworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgTXlWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVRleHRQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtVGV4dEJhY2tncm91bmRQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtVGV4dExldmVsUGFpbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhaW50IG1UYXJnZXRQYWludDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYWludCBtUGF0aFBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIEZvbnRNZXRyaWNzSW50IG1UZXh0TWV0cmljcyA9IG5ldyBGb250TWV0cmljc0ludCgpOworICAgICAgICBwcml2YXRlIGludCBtSGVhZGVyQm90dG9tOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUN1ckRvd247CisgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFBvaW50ZXJTdGF0ZT4gbVBvaW50ZXJzCisgICAgICAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxQb2ludGVyU3RhdGU+KCk7CiAgICAgICAgIAogICAgICAgICBwdWJsaWMgTXlWaWV3KENvbnRleHQgYykgewogICAgICAgICAgICAgc3VwZXIoYyk7CiAgICAgICAgICAgICBtVGV4dFBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtVGV4dFBhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKLSAgICAgICAgICAgIG1UZXh0UGFpbnQuc2V0VGV4dFNpemUoMTApOworICAgICAgICAgICAgbVRleHRQYWludC5zZXRUZXh0U2l6ZSgxMAorICAgICAgICAgICAgICAgICAgICAqIGdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eSk7CiAgICAgICAgICAgICBtVGV4dFBhaW50LnNldEFSR0IoMjU1LCAwLCAwLCAwKTsKICAgICAgICAgICAgIG1UZXh0QmFja2dyb3VuZFBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtVGV4dEJhY2tncm91bmRQYWludC5zZXRBbnRpQWxpYXMoZmFsc2UpOwpAQCAtODUsNiArOTMsOSBAQAogICAgICAgICAgICAgbVRhcmdldFBhaW50ID0gbmV3IFBhaW50KCk7CiAgICAgICAgICAgICBtVGFyZ2V0UGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKICAgICAgICAgICAgIG1UYXJnZXRQYWludC5zZXRBUkdCKDE5MiwgMCwgMCwgMjU1KTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQuc2V0QW50aUFsaWFzKGZhbHNlKTsKKyAgICAgICAgICAgIG1QYXRoUGFpbnQuc2V0QVJHQigyNTUsIDY0LCAxMjgsIDI1NSk7CiAgICAgICAgICAgICBtUGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuU1RST0tFKTsKICAgICAgICAgICAgIG1QYWludC5zZXRTdHJva2VXaWR0aCgxKTsKICAgICAgICAgfQpAQCAtMTA2LDU1ICsxMTcsODIgQEAKICAgICAgICAgICAgIGludCB3ID0gZ2V0V2lkdGgoKS81OwogICAgICAgICAgICAgaW50IGJhc2UgPSAtbVRleHRNZXRyaWNzLmFzY2VudCsxOwogICAgICAgICAgICAgaW50IGJvdHRvbSA9IG1IZWFkZXJCb3R0b207Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMCwgMCwgdy0xLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiWDogIiArIG1DdXJYLCAxLCBiYXNlLCBtVGV4dFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3LCAwLCAodyAqIDIpIC0gMSwgYm90dG9tLCBtVGV4dEJhY2tncm91bmRQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlk6ICIgKyBtQ3VyWSwgMSArIHcsIGJhc2UsIG1UZXh0UGFpbnQpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcgKiAyLCAwLCAodyAqIDMpIC0gMSwgYm90dG9tLCBtVGV4dEJhY2tncm91bmRQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QodyAqIDIsIDAsICh3ICogMikgKyAobUN1clByZXNzdXJlICogdykgLSAxLCBib3R0b20sIG1UZXh0TGV2ZWxQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlByZXM6ICIgKyBtQ3VyUHJlc3N1cmUsIDEgKyB3ICogMiwgYmFzZSwgbVRleHRQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QodyAqIDMsIDAsICh3ICogNCkgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogMywgMCwgKHcgKiAzKSArIChtQ3VyU2l6ZSAqIHcpIC0gMSwgYm90dG9tLCBtVGV4dExldmVsUGFpbnQpOwotICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJTaXplOiAiICsgbUN1clNpemUsIDEgKyB3ICogMywgYmFzZSwgbVRleHRQYWludCk7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QodyAqIDQsIDAsIGdldFdpZHRoKCksIGJvdHRvbSwgbVRleHRCYWNrZ3JvdW5kUGFpbnQpOwotICAgICAgICAgICAgaW50IHZlbG9jaXR5ID0gbVZlbG9jaXR5ID09IG51bGwgPyAwIDogKGludCkgKG1WZWxvY2l0eS5nZXRZVmVsb2NpdHkoKSAqIDEwMDApOwotICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJ5VmVsOiAiICsgdmVsb2NpdHksIDEgKyB3ICogNCwgYmFzZSwgbVRleHRQYWludCk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIGludCBOID0gbVhzLnNpemUoKTsKLSAgICAgICAgICAgIGZsb2F0IGxhc3RYPTAsIGxhc3RZPTA7Ci0gICAgICAgICAgICBtUGFpbnQuc2V0QVJHQigyNTUsIDAsIDI1NSwgMjU1KTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmbG9hdCB4ID0gbVhzLmdldChpKTsKLSAgICAgICAgICAgICAgICBmbG9hdCB5ID0gbVlzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKGxhc3RYLCBsYXN0WSwgeCwgeSwgbVRhcmdldFBhaW50KTsKLSAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChsYXN0WCwgbGFzdFksIG1QYWludCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgTlAgPSBtUG9pbnRlcnMuc2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoTlAgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnRlclN0YXRlIHBzID0gbVBvaW50ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1JlY3QoMCwgMCwgdy0xLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlg6ICIgKyBwcy5tQ3VyWCwgMSwgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcsIDAsICh3ICogMikgLSAxLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlk6ICIgKyBwcy5tQ3VyWSwgMSArIHcsIGJhc2UsIG1UZXh0UGFpbnQpOworICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogMiwgMCwgKHcgKiAzKSAtIDEsIGJvdHRvbSwgbVRleHRCYWNrZ3JvdW5kUGFpbnQpOworICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3UmVjdCh3ICogMiwgMCwgKHcgKiAyKSArIChwcy5tQ3VyUHJlc3N1cmUgKiB3KSAtIDEsIGJvdHRvbSwgbVRleHRMZXZlbFBhaW50KTsKKyAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIlByZXM6ICIgKyBwcy5tQ3VyUHJlc3N1cmUsIDEgKyB3ICogMiwgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcgKiAzLCAwLCAodyAqIDQpIC0gMSwgYm90dG9tLCBtVGV4dEJhY2tncm91bmRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcgKiAzLCAwLCAodyAqIDMpICsgKHBzLm1DdXJTaXplICogdykgLSAxLCBib3R0b20sIG1UZXh0TGV2ZWxQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJTaXplOiAiICsgcHMubUN1clNpemUsIDEgKyB3ICogMywgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KHcgKiA0LCAwLCBnZXRXaWR0aCgpLCBib3R0b20sIG1UZXh0QmFja2dyb3VuZFBhaW50KTsKKyAgICAgICAgICAgICAgICBpbnQgdmVsb2NpdHkgPSBwcy5tVmVsb2NpdHkgPT0gbnVsbCA/IDAgOiAoaW50KSAocHMubVZlbG9jaXR5LmdldFlWZWxvY2l0eSgpICogMTAwMCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJ5VmVsOiAiICsgdmVsb2NpdHksIDEgKyB3ICogNCwgYmFzZSwgbVRleHRQYWludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IHA9MDsgcDxOUDsgcCsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnRlclN0YXRlIHBzID0gbVBvaW50ZXJzLmdldChwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IHBzLm1Ycy5zaXplKCk7CisgICAgICAgICAgICAgICAgZmxvYXQgbGFzdFg9MCwgbGFzdFk9MDsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhdmVMYXN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBkcmF3biA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1QYWludC5zZXRBUkdCKDI1NSwgMTI4LCAyNTUsIDI1NSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ID0gcHMubVhzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSA9IHBzLm1Zcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGbG9hdC5pc05hTih4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUxhc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlTGFzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKGxhc3RYLCBsYXN0WSwgeCwgeSwgbVBhdGhQYWludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BvaW50KGxhc3RYLCBsYXN0WSwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXduID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYXN0WCA9IHg7CisgICAgICAgICAgICAgICAgICAgIGxhc3RZID0geTsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZUxhc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXN0WCA9IHg7Ci0gICAgICAgICAgICAgICAgbGFzdFkgPSB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WZWxvY2l0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCAyNTUsIDAsIDApOwotICAgICAgICAgICAgICAgIGZsb2F0IHhWZWwgPSBtVmVsb2NpdHkuZ2V0WFZlbG9jaXR5KCkgKiAoMTAwMC82MCk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeVZlbCA9IG1WZWxvY2l0eS5nZXRZVmVsb2NpdHkoKSAqICgxMDAwLzYwKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0xpbmUobGFzdFgsIGxhc3RZLCBsYXN0WCt4VmVsLCBsYXN0WSt5VmVsLCBtUGFpbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BvaW50KGxhc3RYLCBsYXN0WSwgbVBhaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1DdXJEb3duKSB7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAsIChpbnQpbUN1clksIGdldFdpZHRoKCksIChpbnQpbUN1clksIG1UYXJnZXRQYWludCk7Ci0gICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKChpbnQpbUN1clgsIDAsIChpbnQpbUN1clgsIGdldEhlaWdodCgpLCBtVGFyZ2V0UGFpbnQpOwotICAgICAgICAgICAgICAgIGludCBwcmVzc3VyZUxldmVsID0gKGludCkobUN1clByZXNzdXJlKjI1NSk7Ci0gICAgICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCBwcmVzc3VyZUxldmVsLCAxMjgsIDI1NS1wcmVzc3VyZUxldmVsKTsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BvaW50KG1DdXJYLCBtQ3VyWSwgbVBhaW50KTsKLSAgICAgICAgICAgICAgICBjYW52YXMuZHJhd0NpcmNsZShtQ3VyWCwgbUN1clksIG1DdXJXaWR0aCwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoZHJhd24pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBzLm1WZWxvY2l0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFpbnQuc2V0QVJHQigyNTUsIDI1NSwgNjQsIDEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4VmVsID0gcHMubVZlbG9jaXR5LmdldFhWZWxvY2l0eSgpICogKDEwMDAvNjApOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeVZlbCA9IHBzLm1WZWxvY2l0eS5nZXRZVmVsb2NpdHkoKSAqICgxMDAwLzYwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShsYXN0WCwgbGFzdFksIGxhc3RYK3hWZWwsIGxhc3RZK3lWZWwsIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1BvaW50KGxhc3RYLCBsYXN0WSwgbVBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobUN1ckRvd24gJiYgcHMubUN1ckRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdMaW5lKDAsIChpbnQpcHMubUN1clksIGdldFdpZHRoKCksIChpbnQpcHMubUN1clksIG1UYXJnZXRQYWludCk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZSgoaW50KXBzLm1DdXJYLCAwLCAoaW50KXBzLm1DdXJYLCBnZXRIZWlnaHQoKSwgbVRhcmdldFBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHByZXNzdXJlTGV2ZWwgPSAoaW50KShwcy5tQ3VyUHJlc3N1cmUqMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgbVBhaW50LnNldEFSR0IoMjU1LCBwcmVzc3VyZUxldmVsLCAxMjgsIDI1NS1wcmVzc3VyZUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdQb2ludChwcy5tQ3VyWCwgcHMubUN1clksIG1QYWludCk7CisgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Q2lyY2xlKHBzLm1DdXJYLCBwcy5tQ3VyWSwgcHMubUN1cldpZHRoLCBtUGFpbnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGludCBhY3Rpb24gPSBldmVudC5nZXRBY3Rpb24oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy9Mb2cuaSgiUG9pbnRlciIsICJNb3Rpb246IGFjdGlvbj0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGFjdGlvbikKKyAgICAgICAgICAgIC8vICAgICAgICArICIgcG9pbnRlcnM9IiArIGV2ZW50LmdldFBvaW50ZXJDb3VudCgpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IE5QID0gbVBvaW50ZXJzLnNpemUoKTsKKyAgICAgICAgICAgIAogICAgICAgICAgICAgLy9tUmVjdC5zZXQoMCwgMCwgZ2V0V2lkdGgoKSwgbUhlYWRlckJvdHRvbSsxKTsKICAgICAgICAgICAgIC8vaW52YWxpZGF0ZShtUmVjdCk7CiAgICAgICAgICAgICAvL2lmIChtQ3VyRG93bikgewpAQCAtMTY0LDI2ICsyMDIsNzAgQEAKICAgICAgICAgICAgIC8vICAgIG1SZWN0LnNldEVtcHR5KCk7CiAgICAgICAgICAgICAvL30KICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04pIHsKLSAgICAgICAgICAgICAgICBtWHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtWXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBtVmVsb2NpdHkgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgaWYgKE5QID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUG9pbnRlclN0YXRlIHBzID0gbmV3IFBvaW50ZXJTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICBwcy5tVmVsb2NpdHkgPSBWZWxvY2l0eVRyYWNrZXIub2J0YWluKCk7CisgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVycy5hZGQocHMpOworICAgICAgICAgICAgICAgICAgICBOUCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBwPTA7IHA8TlA7IHArKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludGVyU3RhdGUgcHMgPSBtUG9pbnRlcnMuZ2V0KHApOworICAgICAgICAgICAgICAgICAgICBwcy5tWHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcHMubVlzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHBzLm1WZWxvY2l0eSA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcHMubUN1ckRvd24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBvaW50ZXJzLmdldCgwKS5tQ3VyRG93biA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVmVsb2NpdHkuYWRkTW92ZW1lbnQoZXZlbnQpOwotICAgICAgICAgICAgbVZlbG9jaXR5LmNvbXB1dGVDdXJyZW50VmVsb2NpdHkoMSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgTiA9IGV2ZW50LmdldEhpc3RvcnlTaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVhzLmFkZChldmVudC5nZXRIaXN0b3JpY2FsWChpKSk7Ci0gICAgICAgICAgICAgICAgbVlzLmFkZChldmVudC5nZXRIaXN0b3JpY2FsWShpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoYWN0aW9uJk1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGlkID0gKGFjdGlvbiZNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9JRF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgPj4gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSURfU0hJRlQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKE5QIDw9IGlkKSB7CisgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJTdGF0ZSBwcyA9IG5ldyBQb2ludGVyU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHMubVZlbG9jaXR5ID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgICAgICBtUG9pbnRlcnMuYWRkKHBzKTsKKyAgICAgICAgICAgICAgICAgICAgTlArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgUG9pbnRlclN0YXRlIHBzID0gbVBvaW50ZXJzLmdldChpZCk7CisgICAgICAgICAgICAgICAgcHMubVZlbG9jaXR5ID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworICAgICAgICAgICAgICAgIHBzLm1DdXJEb3duID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Ycy5hZGQoZXZlbnQuZ2V0WCgpKTsKLSAgICAgICAgICAgIG1Zcy5hZGQoZXZlbnQuZ2V0WSgpKTsKLSAgICAgICAgICAgIG1DdXJEb3duID0gYWN0aW9uID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOCi0gICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTsKLSAgICAgICAgICAgIG1DdXJYID0gKGludClldmVudC5nZXRYKCk7Ci0gICAgICAgICAgICBtQ3VyWSA9IChpbnQpZXZlbnQuZ2V0WSgpOwotICAgICAgICAgICAgbUN1clByZXNzdXJlID0gZXZlbnQuZ2V0UHJlc3N1cmUoKTsKLSAgICAgICAgICAgIG1DdXJTaXplID0gZXZlbnQuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgbUN1cldpZHRoID0gKGludCkobUN1clNpemUqKGdldFdpZHRoKCkvMykpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBpbnQgTkkgPSBldmVudC5nZXRQb2ludGVyQ291bnQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbUN1ckRvd24gPSBhY3Rpb24gIT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQCisgICAgICAgICAgICAgICAgICAgICYmIGFjdGlvbiAhPSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Tkk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJTdGF0ZSBwcyA9IG1Qb2ludGVycy5nZXQoZXZlbnQuZ2V0UG9pbnRlcklkKGkpKTsKKyAgICAgICAgICAgICAgICBwcy5tVmVsb2NpdHkuYWRkTW92ZW1lbnQoZXZlbnQpOworICAgICAgICAgICAgICAgIHBzLm1WZWxvY2l0eS5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gZXZlbnQuZ2V0SGlzdG9yeVNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8TjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHBzLm1Ycy5hZGQoZXZlbnQuZ2V0SGlzdG9yaWNhbFgoaSwgaikpOworICAgICAgICAgICAgICAgICAgICBwcy5tWXMuYWRkKGV2ZW50LmdldEhpc3RvcmljYWxZKGksIGopKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHMubVhzLmFkZChldmVudC5nZXRYKGkpKTsKKyAgICAgICAgICAgICAgICBwcy5tWXMuYWRkKGV2ZW50LmdldFkoaSkpOworICAgICAgICAgICAgICAgIHBzLm1DdXJYID0gKGludClldmVudC5nZXRYKGkpOworICAgICAgICAgICAgICAgIHBzLm1DdXJZID0gKGludClldmVudC5nZXRZKGkpOworICAgICAgICAgICAgICAgIC8vTG9nLmkoIlBvaW50ZXIiLCAiUG9pbnRlciAjIiArIHAgKyAiOiAoIiArIHBzLm1DdXJYCisgICAgICAgICAgICAgICAgLy8gICAgICAgICsgIiwiICsgcHMubUN1clkgKyAiKSIpOworICAgICAgICAgICAgICAgIHBzLm1DdXJQcmVzc3VyZSA9IGV2ZW50LmdldFByZXNzdXJlKGkpOworICAgICAgICAgICAgICAgIHBzLm1DdXJTaXplID0gZXZlbnQuZ2V0U2l6ZShpKTsKKyAgICAgICAgICAgICAgICBwcy5tQ3VyV2lkdGggPSAoaW50KShwcy5tQ3VyU2l6ZSooZ2V0V2lkdGgoKS8zKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgoYWN0aW9uJk1vdGlvbkV2ZW50LkFDVElPTl9NQVNLKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IChhY3Rpb24mTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSURfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgID4+IE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX0lEX1NISUZUOworICAgICAgICAgICAgICAgIGZpbmFsIFBvaW50ZXJTdGF0ZSBwcyA9IG1Qb2ludGVycy5nZXQoaWQpOworICAgICAgICAgICAgICAgIHBzLm1Ycy5hZGQoRmxvYXQuTmFOKTsKKyAgICAgICAgICAgICAgICBwcy5tWXMuYWRkKEZsb2F0Lk5hTik7CisgICAgICAgICAgICAgICAgcHMubUN1ckRvd24gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAogICAgICAgICAgICAgLy9pZiAobUN1ckRvd24pIHsKICAgICAgICAgICAgIC8vICAgIG1SZWN0LnVuaW9uKG1DdXJYLW1DdXJXaWR0aC0zLCBtQ3VyWS1tQ3VyV2lkdGgtMywKICAgICAgICAgICAgIC8vICAgICAgICAgICAgbUN1clgrbUN1cldpZHRoKzMsIG1DdXJZK21DdXJXaWR0aCszKTsKZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAppbmRleCAxZmMxMjFjLi5iOWQzNGY5IDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iWsOhbG9oYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkFrY2UgbmVuw60gcG9kcG9yb3bDoW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iVGF0byBha2NlIG5lbsOtIG1vbWVudMOhbG7EmyBwb2Rwb3JvdsOhbmEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJaw6Fsb2hhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBa2NlIG5lbsOtIHBvZHBvcm92w6FuYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iVGF0byBha2NlIG5lbsOtIG1vbWVudMOhbG7EmyBwb2Rwb3JvdsOhbmEuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKaW5kZXggNDU4NGU2MS4uYjNkZmE2MyAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IlJlc2VydmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJJa2tlIHVuZGVyc3TDuHR0ZXQgaGFuZGxpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJIYW5kbGluZ2VuIGVyIGlra2UgdW5kZXJzdMO4dHRldCBpIMO4amVibGlra2V0LiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iUmVzZXJ2ZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iSWtrZSB1bmRlcnN0w7h0dGV0IGhhbmRsaW5nIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJIYW5kbGluZ2VuIGVyIGlra2UgdW5kZXJzdMO4dHRldCBpIMO4amVibGlra2V0LiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmluZGV4IDkwYmJiMTYuLjhkNTlkZGYgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+Ik5pY2h0IHVudGVyc3TDvHR6dGUgQWt0aW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRGllc2UgQWt0aW9uIHdpcmQgenVyemVpdCBuaWNodCB1bnRlcnN0w7x0enQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJGYWxsYmFjayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iTmljaHQgdW50ZXJzdMO8dHp0ZSBBa3Rpb24iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkRpZXNlIEFrdGlvbiB3aXJkIHp1cnplaXQgbmljaHQgdW50ZXJzdMO8dHp0LiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmluZGV4IGI5ODVhZjcuLmZlY2FmNGEgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiLOlc69zrHOu867zrHOus+EzrnOus6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4izpXOvc6tz4HOs861zrnOsSDPgM6/z4UgzrTOtc69IM+Fz4DOv8+Dz4TOt8+Bzq/Ots61z4TOsc65Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4izpHPhc+Ezq4gzrcgzrXOvc6tz4HOs861zrnOsSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXPhM6xzrkgzrHPhc+Ezq7OvSDPhM63IM+Dz4TOuc6zzrzOri4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+Is6Vzr3Osc67zrvOsc66z4TOuc66zq4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+Is6Vzr3Orc+BzrPOtc65zrEgz4DOv8+FIM60zrXOvSDPhc+Azr/Pg8+EzrfPgc6vzrbOtc+EzrHOuSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4izpHPhc+Ezq4gzrcgzrXOvc6tz4HOs861zrnOsSDOtM61zr0gz4XPgM6/z4PPhM63z4HOr862zrXPhM6xzrkgzrHPhc+Ezq7OvSDPhM63IM+Dz4TOuc6zzrzOri4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmluZGV4IGQxNWEyODcuLjBjZTU3NTEgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iQWNjacOzbiBubyBhZG1pdGlkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkVzYSBhY2Npw7NuIG5vIHNlIGFkbWl0ZSBhY3R1YWxtZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBY2Npw7NuIG5vIGFkbWl0aWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJFc2EgYWNjacOzbiBubyBzZSBhZG1pdGUgYWN0dWFsbWVudGUuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggZDE1YTI4Ny4uMGNlNTc1MSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iQWNjacOzbiBubyBhZG1pdGlkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkVzYSBhY2Npw7NuIG5vIHNlIGFkbWl0ZSBhY3R1YWxtZW50ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBY2Npw7NuIG5vIGFkbWl0aWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJFc2EgYWNjacOzbiBubyBzZSBhZG1pdGUgYWN0dWFsbWVudGUuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKaW5kZXggZGYxZTI5OS4uMDI0YWU0MiAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkFwcGxpY2F0aW9uIGRlIHNlY291cnMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJBY3Rpb24gbm9uIHByaXNlIGVuIGNoYXJnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkNldHRlIGFjdGlvbiBuXCdlc3QgYWN0dWVsbGVtZW50IHBhcyBwcmlzZSBlbiBjaGFyZ2UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJBcHBsaWNhdGlvbiBkZSBzZWNvdXJzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBY3Rpb24gbm9uIHByaXNlIGVuIGNoYXJnZSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iQ2V0dGUgYWN0aW9uIG5cJ2VzdCBhY3R1ZWxsZW1lbnQgcGFzIHByaXNlIGVuIGNoYXJnZS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAppbmRleCAyZDA4YzFiLi5kMjE2ZTU5IDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJBemlvbmUgbm9uIHN1cHBvcnRhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJMXCdhemlvbmUgbm9uIMOoIGFsIG1vbWVudG8gc3VwcG9ydGF0YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJBemlvbmUgbm9uIHN1cHBvcnRhdGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkxcJ2F6aW9uZSBub24gw6ggYWwgbW9tZW50byBzdXBwb3J0YXRhLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCmluZGV4IGYyMjA5MDkuLjc5YWViNDIgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IuOCteODneODvOODiOOBleOCjOOBpuOBhOOBquOBhOaTjeS9nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IuePvuWcqOOCteODneODvOODiOOBleOCjOOBpuOBhOOBquOBhOaTjeS9nOOBp+OBmeOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IuOCteODneODvOODiOOBleOCjOOBpuOBhOOBquOBhOaTjeS9nCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4i54++5Zyo44K144Od44O844OI44GV44KM44Gm44GE44Gq44GE5pON5L2c44Gn44GZ44CCIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKaW5kZXggMmMyOTczZi4uZWMxYzMzMCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+Iu2PtOuwsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IuyngOybkOuQmOyngCDslYrripQg7J6R7JeFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4i7J20IOyekeyXheydgCDtmITsnqwg7KeA7JuQ65CY7KeAIOyViuyKteuLiOuLpC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+Iu2PtOuwsSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4i7KeA7JuQ65CY7KeAIOyViuuKlCDsnpHsl4UiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IuydtCDsnpHsl4XsnYAg7ZiE7J6sIOyngOybkOuQmOyngCDslYrsirXri4jri6QuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggMDI4MTRlNi4uNmZlZDY2MCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IkZhbGxiYWNrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4iVXN0w7h0dGV0IGhhbmRsaW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRGVubmUgaGFuZGxpbmdlbiBlciBpa2tlIHN0w7h0dGV0IG7DpS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IkZhbGxiYWNrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJVc3TDuHR0ZXQgaGFuZGxpbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkRlbm5lIGhhbmRsaW5nZW4gZXIgaWtrZSBzdMO4dHRldCBuw6UuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKaW5kZXggODk4OWVmZC4uZjM0Nzk2NCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IlJlc2VydmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJOaWV0LW9uZGVyc3RldW5kZSBhY3RpZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkRpZSBhY3RpZSB3b3JkdCBtb21lbnRlZWwgbmlldCBvbmRlcnN0ZXVuZC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSI+IlJlc2VydmUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+Ik5pZXQtb25kZXJzdGV1bmRlIGFjdGllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJEaWUgYWN0aWUgd29yZHQgbW9tZW50ZWVsIG5pZXQgb25kZXJzdGV1bmQuIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKaW5kZXggNTc0MDQ5OC4uNzNhMTc2YSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+Ild5Y29mYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+Ik5pZW9ic8WCdWdpd2FuYSBjenlubm/Fm8SHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iVGEgY3p5bm5vxZvEhyBuaWUgamVzdCBha3R1YWxuaWUgb2JzxYJ1Z2l3YW5hLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iV3ljb2ZhbmllIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiJOaWVvYnPFgnVnaXdhbmEgY3p5bm5vxZvEhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iVGEgY3p5bm5vxZvEhyBuaWUgamVzdCBha3R1YWxuaWUgb2JzxYJ1Z2l3YW5hLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKaW5kZXggYjIyNmVhNS4uM2M3ZWM5ZCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJBY8Onw6NvIG7Do28gc3Vwb3J0YWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4iRXN0YSBhY8Onw6NvIGFpbmRhIG7Do28gw6kgc3Vwb3J0YWRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkFjw6fDo28gbsOjbyBzdXBvcnRhZGEiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkVzdGHCt2Fjw6fDo2/Ct2FpbmRhwrduw6NvwrfDqcK3c3Vwb3J0YWRhLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCmluZGV4IDM5NTAwNGMuLjA4YTNmYWEgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiJGYWxsYmFjayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IkHDp8OjbyBuw6NvIHN1cG9ydGFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IkVzc2EgYcOnw6NvIG7Do28gw6kgc3Vwb3J0YWRhIG5vIG1vbWVudG8uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJGYWxsYmFjayI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InRpdGxlIj4iQcOnw6NvIG7Do28gc3Vwb3J0YWRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiJFc3NhIGHDp8OjbyBuw6NvIMOpIHN1cG9ydGFkYSBubyBtb21lbnRvLiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCmluZGV4IDA4NGMzZjMuLjI0YzM0ODAgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKQEAgLTE1LDcgKzE1LDcgQEAKIC0tPgogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiIG1zZ2lkPSIxNjE0MTAwMDE5MTMxMTY2MDYiPiLQn9C10YDQtdGF0L7QtCDQsiDQvtCx0YXQvtC00L3QvtC5INGA0LXQttC40LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiLQndC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80L7QtSDQtNC10LnRgdGC0LLQuNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4i0JIg0L3QsNGB0YLQvtGP0YnQtdC1INCy0YDQtdC80Y8g0Y3RgtC+INC00LXQudGB0YLQstC40LUg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YLRgdGPLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4i0J/QtdGA0LXRhdC+0LQg0LIg0L7QsdGF0L7QtNC90L7QuSDRgNC10LbQuNC8Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiLQndC10L/QvtC00LTQtdGA0LbQuNCy0LDQtdC80L7QtSDQtNC10LnRgdGC0LLQuNC1Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiPiLQkiDQvdCw0YHRgtC+0Y/RidC10LUg0LLRgNC10LzRjyDRjdGC0L4g0LTQtdC50YHRgtCy0LjQtSDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8uIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKaW5kZXggMjI0ZDk0Ni4uOWRhZTEwZCAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IlJlc2VydiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IsOFdGfDpHJkZW4gc3TDtmRzIGludGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJEZW4gaMOkciDDpXRnw6RyZGVuIHN0w7ZkcyBpbnRlIGbDtnIgbsOkcnZhcmFuZGUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiJSZXNlcnYiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IsOFdGfDpHJkZW4gc3TDtmRzIGludGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IkRlbiBow6RyIMOldGfDpHJkZW4gc3TDtmRzIGludGUgZsO2ciBuw6RydmFyYW5kZS4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAppbmRleCA5YzdlZDE1Li4yN2I4NjBhIDEwMDY0NAotLS0gYS9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4iRmFsbGJhY2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ0aXRsZSIgbXNnaWQ9IjgxNTYyNzQ1NjUwMDYxMjUxMzYiPiJEZXN0ZWtsZW5tZXllbiBpxZ9sZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJlcnJvciIgbXNnaWQ9IjY1Mzk2MTU4MzI5MjMzNjIzMDEiPiJCdSBpxZ9sZW0gxZ91IGFuIGRlc3Rla2xlbm1peW9yLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4iRmFsbGJhY2siPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IkRlc3Rla2xlbm1leWVuIGnFn2xlbSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4iQnUgacWfbGVtIMWfdSBhbiBkZXN0ZWtsZW5taXlvci4iPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmluZGV4IDViMWZiZjguLmU2Y2ZkZTEgMTAwNjQ0Ci0tLSBhL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIGIvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApAQCAtMTUsNyArMTUsNyBAQAogLS0+CiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJhcHBUaXRsZSIgbXNnaWQ9IjE2MTQxMDAwMTkxMzExNjYwNiI+IuWQjuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InRpdGxlIiBtc2dpZD0iODE1NjI3NDU2NTAwNjEyNTEzNiI+IuS4jeaUr+aMgeatpOaTjeS9nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImVycm9yIiBtc2dpZD0iNjUzOTYxNTgzMjkyMzM2MjMwMSI+IuebruWJjeS4jeaUr+aMgeivpeaTjeS9nOOAgiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIj4i5ZCO5aSHIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiPiLkuI3mlK/mjIHmraTmk43kvZwiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJlcnJvciI+IuebruWJjeS4jeaUr+aMgeivpeaTjeS9nOOAgiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL2FwcHMvRmFsbGJhY2svcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKaW5kZXggMDRkN2Y0Zi4uNTJhZmRiZSAxMDA2NDQKLS0tIGEvYXBwcy9GYWxsYmFjay9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9hcHBzL0ZhbGxiYWNrL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9ImFwcFRpdGxlIiBtc2dpZD0iMTYxNDEwMDAxOTEzMTE2NjA2Ij4i5YKZ55SoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idGl0bGUiIG1zZ2lkPSI4MTU2Mjc0NTY1MDA2MTI1MTM2Ij4i5LiN5pSv5o+055qE5pON5L2cIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZXJyb3IiIG1zZ2lkPSI2NTM5NjE1ODMyOTIzMzYyMzAxIj4i55uu5YmN5LiN5pSv5o+05q2k5pON5L2c44CCIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYXBwVGl0bGUiPiLlgpnnlKgiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZSI+IuS4jeaUr+aPtOeahOaTjeS9nCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImVycm9yIj4i55uu5YmN5LiN5pSv5o+05q2k5pON5L2c44CCIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vQW5kcm9pZC5tayBiL2FwcHMvVGVybS9BbmRyb2lkLm1rCmluZGV4IDg0M2FlYzUuLjlmZjZjMGQgMTAwNjQ0Ci0tLSBhL2FwcHMvVGVybS9BbmRyb2lkLm1rCisrKyBiL2FwcHMvVGVybS9BbmRyb2lkLm1rCkBAIC0xLDMgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBtYWtlZmlsZSBzaG93cyBob3cgdG8gYnVpbGQgYSBzaGFyZWQgbGlicmFyeSBhbmQgYW4gYWN0aXZpdHkgdGhhdAorIyBidW5kbGVzIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgY2FsbHMgaXQgdXNpbmcgSk5JLgorCitUT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQnVpbGQgYWN0aXZpdHkKKwogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIApAQCAtNyw0ICszMCwxMSBAQAogCiBMT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVybQogCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJ0ZXJtCisKIGluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEFsc28gYnVpbGQgYWxsIG9mIHRoZSBzdWItdGFyZ2V0cyB1bmRlciB0aGlzIG9uZTogdGhlIHNoYXJlZCBsaWJyYXJ5LgoraW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9qbmkvQW5kcm9pZC5tayBiL2FwcHMvVGVybS9qbmkvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU0YTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwcy9UZXJtL2puaS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBtYWtlZmlsZSBzdXBwbGllcyB0aGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGEgbGlicmFyeSBvZiBKTkkgY29kZSBmb3IKKyMgdXNlIGJ5IG91ciBleGFtcGxlIG9mIGhvdyB0byBidW5kbGUgYSBzaGFyZWQgbGlicmFyeSB3aXRoIGFuIEFQSy4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCisKKyMgVGhpcyBpcyB0aGUgdGFyZ2V0IGJlaW5nIGJ1aWx0LgorTE9DQUxfTU9EVUxFOj0gbGlidGVybQorCisKKyMgQWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCB3ZSB3aWxsIGNvbXBpbGUuCitMT0NBTF9TUkNfRklMRVM6PSBcCisgIHRlcm1FeGVjLmNwcAorCisjIEFsbCBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyB3ZSBsaW5rIGFnYWluc3QuCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJ1dGlscworCisjIE5vIHN0YXRpYyBsaWJyYXJpZXMuCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKKyMgQWxzbyBuZWVkIHRoZSBKTkkgaGVhZGVycy4KK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCSQoSk5JX0hfSU5DTFVERSkKKworIyBObyBzcGVjaWFsIGNvbXBpbGVyIGZsYWdzLgorTE9DQUxfQ0ZMQUdTICs9CisKKyMgRG9uJ3QgcHJlbGluayB0aGlzIGxpYnJhcnkuICBGb3IgbW9yZSBlZmZpY2llbnQgY29kZSwgeW91IG1heSB3YW50CisjIHRvIGFkZCB0aGlzIGxpYnJhcnkgdG8gdGhlIHByZWxpbmsgbWFwIGFuZCBzZXQgdGhpcyB0byB0cnVlLiBIb3dldmVyLAorIyBpdCdzIGRpZmZpY3VsdCB0byBkbyB0aGlzIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBsaWVkIGFzCisjIHBhcnQgb2YgYSBzeXN0ZW0gaW1hZ2UuCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2FwcHMvVGVybS9qbmkvdGVybUV4ZWMuY3BwIGIvYXBwcy9UZXJtL2puaS90ZXJtRXhlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2NjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvVGVybS9qbmkvdGVybUV4ZWMuY3BwCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRXhlYyIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgInV0aWxzL0xvZy5oIgorI2luY2x1ZGUgInV0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworc3RhdGljIGpjbGFzcyBjbGFzc19maWxlRGVzY3JpcHRvcjsKK3N0YXRpYyBqZmllbGRJRCBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yOworc3RhdGljIGptZXRob2RJRCBtZXRob2RfZmlsZURlc2NyaXB0b3JfaW5pdDsKKworCitjbGFzcyBTdHJpbmc4IHsKK3B1YmxpYzoKKyAgICBTdHJpbmc4KCkgeworICAgICAgICBtU3RyaW5nID0gMDsKKyAgICB9CisgICAgCisgICAgflN0cmluZzgoKSB7CisgICAgICAgIGlmIChtU3RyaW5nKSB7CisgICAgICAgICAgICBmcmVlKG1TdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXQoY29uc3QgY2hhcjE2X3QqIG8sIHNpemVfdCBudW1DaGFycykgeworICAgICAgICBtU3RyaW5nID0gKGNoYXIqKSBtYWxsb2MobnVtQ2hhcnMgKyAxKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1DaGFyczsgaSsrKSB7CisgICAgICAgICAgICBtU3RyaW5nW2ldID0gKGNoYXIpIG9baV07CisgICAgICAgIH0KKyAgICAgICAgbVN0cmluZ1tudW1DaGFyc10gPSAnXDAnOworICAgIH0KKyAgICAKKyAgICBjb25zdCBjaGFyKiBzdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBtU3RyaW5nOworICAgIH0KK3ByaXZhdGU6CisgICAgY2hhciogbVN0cmluZzsKK307CisKK3N0YXRpYyBpbnQgY3JlYXRlX3N1YnByb2Nlc3MoY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmcwLCBjb25zdCBjaGFyICphcmcxLAorICAgIGludCogcFByb2Nlc3NJZCkKK3sKKyAgICBjaGFyICpkZXZuYW1lOworICAgIGludCBwdG07CisgICAgcGlkX3QgcGlkOworCisgICAgcHRtID0gb3BlbigiL2Rldi9wdG14IiwgT19SRFdSKTsgLy8gfCBPX05PQ1RUWSk7CisgICAgaWYocHRtIDwgMCl7CisgICAgICAgIExPR0UoIlsgY2Fubm90IG9wZW4gL2Rldi9wdG14IC0gJXMgXVxuIixzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZjbnRsKHB0bSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKyAgICBpZihncmFudHB0KHB0bSkgfHwgdW5sb2NrcHQocHRtKSB8fAorICAgICAgICgoZGV2bmFtZSA9IChjaGFyKikgcHRzbmFtZShwdG0pKSA9PSAwKSl7CisgICAgICAgIExPR0UoIlsgdHJvdWJsZSB3aXRoIC9kZXYvcHRteCAtICVzIF1cbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgcGlkID0gZm9yaygpOworICAgIGlmKHBpZCA8IDApIHsKKyAgICAgICAgTE9HRSgiLSBmb3JrIGZhaWxlZDogJXMgLVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmKHBpZCA9PSAwKXsKKyAgICAgICAgY2xvc2UocHRtKTsKKworICAgICAgICBpbnQgcHRzOworCisgICAgICAgIHNldHNpZCgpOworICAgICAgICAKKyAgICAgICAgcHRzID0gb3BlbihkZXZuYW1lLCBPX1JEV1IpOworICAgICAgICBpZihwdHMgPCAwKSBleGl0KC0xKTsKKworICAgICAgICBkdXAyKHB0cywgMCk7CisgICAgICAgIGR1cDIocHRzLCAxKTsKKyAgICAgICAgZHVwMihwdHMsIDIpOworCisgICAgICAgIGV4ZWNsKGNtZCwgY21kLCBhcmcwLCBhcmcxLCBOVUxMKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBQcm9jZXNzSWQgPSAoaW50KSBwaWQ7CisgICAgICAgIHJldHVybiBwdG07CisgICAgfQorfQorCisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfb3NfRXhlY19jcmVhdGVTdWJQcm9jZXNzKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LAorICAgIGpzdHJpbmcgY21kLCBqc3RyaW5nIGFyZzAsIGpzdHJpbmcgYXJnMSwgamludEFycmF5IHByb2Nlc3NJZEFycmF5KQoreworICAgIGNvbnN0IGpjaGFyKiBzdHIgPSBjbWQgPyBlbnYtPkdldFN0cmluZ0NyaXRpY2FsKGNtZCwgMCkgOiAwOworICAgIFN0cmluZzggY21kXzg7CisgICAgaWYgKHN0cikgeworICAgICAgICBjbWRfOC5zZXQoc3RyLCBlbnYtPkdldFN0cmluZ0xlbmd0aChjbWQpKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwoY21kLCBzdHIpOworICAgIH0KKworICAgIHN0ciA9IGFyZzAgPyBlbnYtPkdldFN0cmluZ0NyaXRpY2FsKGFyZzAsIDApIDogMDsKKyAgICBjb25zdCBjaGFyKiBhcmcwU3RyID0gMDsKKyAgICBTdHJpbmc4IGFyZzBfODsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIGFyZzBfOC5zZXQoc3RyLCBlbnYtPkdldFN0cmluZ0xlbmd0aChhcmcwKSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ0NyaXRpY2FsKGFyZzAsIHN0cik7CisgICAgICAgIGFyZzBTdHIgPSBhcmcwXzguc3RyaW5nKCk7CisgICAgfQorCisgICAgc3RyID0gYXJnMSA/IGVudi0+R2V0U3RyaW5nQ3JpdGljYWwoYXJnMSwgMCkgOiAwOworICAgIGNvbnN0IGNoYXIqIGFyZzFTdHIgPSAwOworICAgIFN0cmluZzggYXJnMV84OworICAgIGlmIChzdHIpIHsKKyAgICAgICAgYXJnMV84LnNldChzdHIsIGVudi0+R2V0U3RyaW5nTGVuZ3RoKGFyZzEpKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nQ3JpdGljYWwoYXJnMSwgc3RyKTsKKyAgICAgICAgYXJnMVN0ciA9IGFyZzFfOC5zdHJpbmcoKTsKKyAgICB9CisKKyAgICBpbnQgcHJvY0lkOworICAgIGludCBwdG0gPSBjcmVhdGVfc3VicHJvY2VzcyhjbWRfOC5zdHJpbmcoKSwgYXJnMFN0ciwgYXJnMVN0ciwgJnByb2NJZCk7CisgICAgCisgICAgaWYgKHByb2Nlc3NJZEFycmF5KSB7CisgICAgICAgIGludCBwcm9jSWRMZW4gPSBlbnYtPkdldEFycmF5TGVuZ3RoKHByb2Nlc3NJZEFycmF5KTsKKyAgICAgICAgaWYgKHByb2NJZExlbiA+IDApIHsKKyAgICAgICAgICAgIGpib29sZWFuIGlzQ29weTsKKyAgICAKKyAgICAgICAgICAgIGludCogcFByb2NJZCA9IChpbnQqKSBlbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwocHJvY2Vzc0lkQXJyYXksICZpc0NvcHkpOworICAgICAgICAgICAgaWYgKHBQcm9jSWQpIHsKKyAgICAgICAgICAgICAgICAqcFByb2NJZCA9IHByb2NJZDsKKyAgICAgICAgICAgICAgICBlbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKHByb2Nlc3NJZEFycmF5LCBwUHJvY0lkLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBqb2JqZWN0IHJlc3VsdCA9IGVudi0+TmV3T2JqZWN0KGNsYXNzX2ZpbGVEZXNjcmlwdG9yLCBtZXRob2RfZmlsZURlc2NyaXB0b3JfaW5pdCk7CisgICAgCisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgTE9HRSgiQ291bGRuJ3QgY3JlYXRlIGEgRmlsZURlc2NyaXB0b3IuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlbnYtPlNldEludEZpZWxkKHJlc3VsdCwgZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvciwgcHRtKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZCBhbmRyb2lkX29zX0V4ZWNfc2V0UHR5V2luZG93U2l6ZShKTklFbnYgKmVudiwgam9iamVjdCBjbGF6eiwKKyAgICBqb2JqZWN0IGZpbGVEZXNjcmlwdG9yLCBqaW50IHJvdywgamludCBjb2wsIGppbnQgeHBpeGVsLCBqaW50IHlwaXhlbCkKK3sKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IHdpbnNpemUgc3o7CisKKyAgICBmZCA9IGVudi0+R2V0SW50RmllbGQoZmlsZURlc2NyaXB0b3IsIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IpOworCisgICAgaWYgKGVudi0+RXhjZXB0aW9uT2NjdXJyZWQoKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgc3oud3Nfcm93ID0gcm93OworICAgIHN6LndzX2NvbCA9IGNvbDsKKyAgICBzei53c194cGl4ZWwgPSB4cGl4ZWw7CisgICAgc3oud3NfeXBpeGVsID0geXBpeGVsOworICAgIAorICAgIGlvY3RsKGZkLCBUSU9DU1dJTlNaLCAmc3opOworfQorCitzdGF0aWMgaW50IGFuZHJvaWRfb3NfRXhlY193YWl0Rm9yKEpOSUVudiAqZW52LCBqb2JqZWN0IGNsYXp6LAorICAgIGppbnQgcHJvY0lkKSB7CisgICAgaW50IHN0YXR1czsKKyAgICB3YWl0cGlkKHByb2NJZCwgJnN0YXR1cywgMCk7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7CisgICAgICAgIHJlc3VsdCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfb3NfRXhlY19jbG9zZShKTklFbnYgKmVudiwgam9iamVjdCBjbGF6eiwgam9iamVjdCBmaWxlRGVzY3JpcHRvcikKK3sKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IHdpbnNpemUgc3o7CisKKyAgICBmZCA9IGVudi0+R2V0SW50RmllbGQoZmlsZURlc2NyaXB0b3IsIGZpZWxkX2ZpbGVEZXNjcmlwdG9yX2Rlc2NyaXB0b3IpOworCisgICAgaWYgKGVudi0+RXhjZXB0aW9uT2NjdXJyZWQoKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgY2xvc2UoZmQpOworfQorCisKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfRmlsZURlc2NyaXB0b3IoSk5JRW52ICplbnYpCit7CisgICAgY2xhc3NfZmlsZURlc2NyaXB0b3IgPSBlbnYtPkZpbmRDbGFzcygiamF2YS9pby9GaWxlRGVzY3JpcHRvciIpOworCisgICAgaWYgKGNsYXNzX2ZpbGVEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmaWVsZF9maWxlRGVzY3JpcHRvcl9kZXNjcmlwdG9yID0gZW52LT5HZXRGaWVsZElEKGNsYXNzX2ZpbGVEZXNjcmlwdG9yLCAiZGVzY3JpcHRvciIsICJJIik7CisKKyAgICBpZiAoZmllbGRfZmlsZURlc2NyaXB0b3JfZGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgRmlsZURlc2NyaXB0b3IuZGVzY3JpcHRvciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWV0aG9kX2ZpbGVEZXNjcmlwdG9yX2luaXQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXNzX2ZpbGVEZXNjcmlwdG9yLCAiPGluaXQ+IiwgIigpViIpOworICAgIGlmIChtZXRob2RfZmlsZURlc2NyaXB0b3JfaW5pdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgRmlsZURlc2NyaXB0b3IuaW5pdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgIH0KKyAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzUGF0aE5hbWUgPSAiY29tL2FuZHJvaWQvdGVybS9FeGVjIjsKKworc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBtZXRob2RfdGFibGVbXSA9IHsKKyAgICB7ICJjcmVhdGVTdWJwcm9jZXNzIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZztbSSlMamF2YS9pby9GaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAodm9pZCopIGFuZHJvaWRfb3NfRXhlY19jcmVhdGVTdWJQcm9jZXNzIH0sCisgICAgeyAic2V0UHR5V2luZG93U2l6ZSIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7SUlJSSlWIiwKKyAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0V4ZWNfc2V0UHR5V2luZG93U2l6ZX0sCisgICAgeyAid2FpdEZvciIsICIoSSlJIiwKKyAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0V4ZWNfd2FpdEZvcn0sCisgICAgeyAiY2xvc2UiLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIiwKKyAgICAgICAgKHZvaWQqKSBhbmRyb2lkX29zX0V4ZWNfY2xvc2V9Cit9OworCisvKgorICogUmVnaXN0ZXIgc2V2ZXJhbCBuYXRpdmUgbWV0aG9kcyBmb3Igb25lIGNsYXNzLgorICovCitzdGF0aWMgaW50IHJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhKTklFbnYqIGVudiwgY29uc3QgY2hhciogY2xhc3NOYW1lLAorICAgIEpOSU5hdGl2ZU1ldGhvZCogZ01ldGhvZHMsIGludCBudW1NZXRob2RzKQoreworICAgIGpjbGFzcyBjbGF6ejsKKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJOYXRpdmUgcmVnaXN0cmF0aW9uIHVuYWJsZSB0byBmaW5kIGNsYXNzICclcyciLCBjbGFzc05hbWUpOworICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIH0KKyAgICBpZiAoZW52LT5SZWdpc3Rlck5hdGl2ZXMoY2xhenosIGdNZXRob2RzLCBudW1NZXRob2RzKSA8IDApIHsKKyAgICAgICAgTE9HRSgiUmVnaXN0ZXJOYXRpdmVzIGZhaWxlZCBmb3IgJyVzJyIsIGNsYXNzTmFtZSk7CisgICAgICAgIHJldHVybiBKTklfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEpOSV9UUlVFOworfQorCisvKgorICogUmVnaXN0ZXIgbmF0aXZlIG1ldGhvZHMgZm9yIGFsbCBjbGFzc2VzIHdlIGtub3cgYWJvdXQuCisgKgorICogcmV0dXJucyBKTklfVFJVRSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHJlZ2lzdGVyTmF0aXZlcyhKTklFbnYqIGVudikKK3sKKyAgaWYgKCFyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCBjbGFzc1BhdGhOYW1lLCBtZXRob2RfdGFibGUsIAorICAgICAgICAgICAgICAgICBzaXplb2YobWV0aG9kX3RhYmxlKSAvIHNpemVvZihtZXRob2RfdGFibGVbMF0pKSkgeworICAgIHJldHVybiBKTklfRkFMU0U7CisgIH0KKworICByZXR1cm4gSk5JX1RSVUU7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIFZNIHdoZW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGZpcnN0IGxvYWRlZC4KKyAqLworIAordHlwZWRlZiB1bmlvbiB7CisgICAgSk5JRW52KiBlbnY7CisgICAgdm9pZCogdmVudjsKK30gVW5pb25KTklFbnZUb1ZvaWQ7CisKK2ppbnQgSk5JX09uTG9hZChKYXZhVk0qIHZtLCB2b2lkKiByZXNlcnZlZCkgeworICAgIFVuaW9uSk5JRW52VG9Wb2lkIHVlbnY7CisgICAgdWVudi52ZW52ID0gTlVMTDsKKyAgICBqaW50IHJlc3VsdCA9IC0xOworICAgIEpOSUVudiogZW52ID0gTlVMTDsKKyAgICAKKyAgICBMT0dJKCJKTklfT25Mb2FkIik7CisKKyAgICBpZiAodm0tPkdldEVudigmdWVudi52ZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICBMT0dFKCJFUlJPUjogR2V0RW52IGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGVudiA9IHVlbnYuZW52OworICAgIAorICAgIGlmICgocmVzdWx0ID0gcmVnaXN0ZXJfRmlsZURlc2NyaXB0b3IoZW52KSkgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiByZWdpc3RlckZpbGVEZXNjcmlwdG9yIGZhaWxlZCIpOworICAgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgaWYgKHJlZ2lzdGVyTmF0aXZlcyhlbnYpICE9IEpOSV9UUlVFKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiByZWdpc3Rlck5hdGl2ZXMgZmFpbGVkIik7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgCisgICAgcmVzdWx0ID0gSk5JX1ZFUlNJT05fMV80OworICAgIAorYmFpbDoKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL0V4ZWMuamF2YSBiL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9FeGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYWNmYwotLS0gL2Rldi9udWxsCisrKyBiL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9FeGVjLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVybTsKKworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgYSBzdWJwcm9jZXNzLgorICogPHA+CisgKiBOb3RlOiBUaGUgbmF0aXZlIG1ldGhvZHMgYWNjZXNzIGEgcGFja2FnZS1wcml2YXRlCisgKiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIGZpZWxkIHRvIGdldCBhbmQgc2V0IHRoZSByYXcgTGludXgKKyAqIGZpbGUgZGVzY3JpcHRvci4gVGhpcyBtaWdodCBicmVhayBpZiB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAqIGphdmEuaW8uRmlsZURlc2NyaXB0b3IgaXMgY2hhbmdlZC4KKyAqLworCitwdWJsaWMgY2xhc3MgRXhlYworeworICAgIHN0YXRpYyB7CisgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgidGVybSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN1YnByb2Nlc3MuIERpZmZlcnMgZnJvbSBqYXZhLmxhbmcuUHJvY2Vzc0J1aWxkZXIgaW4KKyAgICAgKiB0aGF0IGEgcHR5IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc3VicHJvY2Vzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBFeGVjLmNsb3NlKCkgb24gdGhlIHJldHVybmVkCisgICAgICogZmlsZSBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNtZCBUaGUgY29tbWFuZCB0byBleGVjdXRlCisgICAgICogQHBhcmFtIGFyZzAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjb21tYW5kLCBtYXkgYmUgbnVsbAorICAgICAqIEBwYXJhbSBhcmcxIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQsIG1heSBiZSBudWxsCisgICAgICogQHBhcmFtIHByb2Nlc3NJZCBBIG9uZS1lbGVtZW50IGFycmF5IHRvIHdoaWNoIHRoZSBwcm9jZXNzIElEIG9mIHRoZQorICAgICAqIHN0YXJ0ZWQgcHJvY2VzcyB3aWxsIGJlIHdyaXR0ZW4uCisgICAgICogQHJldHVybiB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBzdGFydGVkIHByb2Nlc3MuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBGaWxlRGVzY3JpcHRvciBjcmVhdGVTdWJwcm9jZXNzKAorICAgICAgICBTdHJpbmcgY21kLCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIGludFtdIHByb2Nlc3NJZCk7CisgICAgICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgd2lkb3cgc2l6ZSBmb3IgYSBnaXZlbiBwdHkuIEFsbG93cyBwcm9ncmFtcworICAgICAqIGNvbm5lY3RlZCB0byB0aGUgcHR5IGxlYXJuIGhvdyBsYXJnZSB0aGVpciBzY3JlZW4gaXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBzZXRQdHlXaW5kb3dTaXplKEZpbGVEZXNjcmlwdG9yIGZkLAorICAgICAgIGludCByb3csIGludCBjb2wsIGludCB4cGl4ZWwsIGludCB5cGl4ZWwpOworCisgICAgLyoqCisgICAgICogQ2F1c2VzIHRoZSBjYWxsaW5nIHRocmVhZCB0byB3YWl0IGZvciB0aGUgcHJvY2VzcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgICogcmVjZWl2ZXIgdG8gZmluaXNoIGV4ZWN1dGluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGV4aXQgdmFsdWUgb2YgdGhlIFByb2Nlc3MgYmVpbmcgd2FpdGVkIG9uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBpbnQgd2FpdEZvcihpbnQgcHJvY2Vzc0lkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgY2xvc2UoRmlsZURlc2NyaXB0b3IgZmQpOworfQorCmRpZmYgLS1naXQgYS9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vVGVybS5qYXZhIGIvYXBwcy9UZXJtL3NyYy9jb20vYW5kcm9pZC90ZXJtL1Rlcm0uamF2YQppbmRleCAzNGNkN2UxLi42MDQxYmFmIDEwMDY0NAotLS0gYS9hcHBzL1Rlcm0vc3JjL2NvbS9hbmRyb2lkL3Rlcm0vVGVybS5qYXZhCisrKyBiL2FwcHMvVGVybS9zcmMvY29tL2FuZHJvaWQvdGVybS9UZXJtLmphdmEKQEAgLTE2LDYgKzE2LDEyIEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQudGVybTsKIAoraW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtMzUsNyArNDEsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2U7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRXhlYzsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlcjsKQEAgLTU0LDEyICs1OSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkV4dHJhY3RlZFRleHRSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KIC8qKgogICogQSB0ZXJtaW5hbCBlbXVsYXRvciBhY3Rpdml0eS4KICAqLwpAQCAtOTYsMTAgKzk1LDcgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBwc2V1ZG8tdGVsZXR5cGUgKHB0eSkgZmlsZSBkZXNjcmlwdG9yIHRoYXQgd2UgdXNlIHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiBhbm90aGVyIHByb2Nlc3MsIHR5cGljYWxseSBhIHNoZWxsLiBDdXJyZW50bHkgd2UganVzdCB1c2UgdGhpcyB0byBnZXQgdGhlCi0gICAgICogbVRlcm1JbiAvIG1UZXJtT3V0IGZpbGUgZGVzY3JpcHRvcnMsIGJ1dCB3aGVuIHdlIGltcGxlbWVudCByZXNpemluZyBvZgotICAgICAqIHRoZSB0ZXJtaW5hbCB3ZSB3aWxsIG5lZWQgaXQgdG8gaXNzdWUgdGhlIGlvY3RsIHRvIGluZm9ybSB0aGUgb3RoZXIKLSAgICAgKiBwcm9jZXNzIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgdGVybWluYWwgc2l6ZS4KKyAgICAgKiBhbm90aGVyIHByb2Nlc3MsIHR5cGljYWxseSBhIHNoZWxsLgogICAgICAqLwogICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IgbVRlcm1GZDsKIApAQCAtMTg4LDYgKzE4NCwxNSBAQAogICAgICAgICB1cGRhdGVQcmVmcygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIGlmIChtVGVybUZkICE9IG51bGwpIHsKKyAgICAgICAgICAgIEV4ZWMuY2xvc2UobVRlcm1GZCk7CisgICAgICAgICAgICBtVGVybUZkID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpIHsKICAgICAgICAgaW50W10gcHJvY2Vzc0lkID0gbmV3IGludFsxXTsKIApkaWZmIC0tZ2l0IGEvYnVpbGQvQW5kcm9pZC5tayBiL2J1aWxkL0FuZHJvaWQubWsKaW5kZXggY2JhOTZjNi4uZDgwNGNlNyAxMDA2NDQKLS0tIGEvYnVpbGQvQW5kcm9pZC5taworKysgYi9idWlsZC9BbmRyb2lkLm1rCkBAIC00LDcgKzQsNyBAQAogIyBhbnl3aGVyZSBlbHNlLCBhbmQgdGhlIHJ1bGVzIGRvbid0IHN1cHBvcnQuICBBZGl0aW9uYWxseSwgdGhlIGRlcGVuZW5jaWVzIG9uCiAjIHRoZXNlIGZpbGVzIGRvbid0IHJlYWxseSBtYXR0ZXIsIGJlY2F1c2UgdGhleSBhcmUgYWxsIGdlbmVyYXRlZCBhcyBwYXJ0IG9mCiAjIGJ1aWxkaW5nIHRoZSBkb2NzLiAgU28gZm9yIHRoZSBkZXBlbmRlbmN5LCB3ZSBqdXN0IHVzZSB0aGUKLSMgb2ZmbGluZS1zZGstdGltZXN0YW1wIGZpbGUsIHdoaWNoIGlzIHRoZSAkQCBvZiB0aGUgZHJvaWRkb2MgcnVsZS4KKyMgYXBpLXN0dWJzLXRpbWVzdGFtcCBmaWxlLCB3aGljaCBpcyB0aGUgJEAgb2YgdGhlIGRyb2lkZG9jIHJ1bGUuCiAjIFdlIGFsc28gbmVlZCB0byBkZXBlbmQgb24gZnJhbWV3b3JrLXJlcy5hcGssIGluIG9yZGVyIHRvIHB1bGwgdGhlCiAjIHJlc291cmNlIGZpbGVzIG91dCBvZiB0aGVyZSBmb3IgYWFwdC4KICMKQEAgLTIyLDcgKzIyLDcgQEAKICQoZnVsbF90YXJnZXQpOiBQUklWQVRFX0NMQVNTX0lOVEVSTUVESUFURVNfRElSIDo9ICQoY2xhc3Nlc19kaXIpCiAkKGZ1bGxfdGFyZ2V0KTogUFJJVkFURV9GUkFNRVdPUktfUkVTX1BBQ0tBR0UgOj0gJChmcmFtZXdvcmtfcmVzX3BhY2thZ2UpCiAKLSQoZnVsbF90YXJnZXQpOiAkKE9VVF9ET0NTKS9vZmZsaW5lLXNkay10aW1lc3RhbXAgJChmcmFtZXdvcmtfcmVzX3BhY2thZ2UpCiskKGZ1bGxfdGFyZ2V0KTogJChPVVRfRE9DUykvYXBpLXN0dWJzLXRpbWVzdGFtcCAkKGZyYW1ld29ya19yZXNfcGFja2FnZSkKIAlAZWNobyBDb21waWxpbmcgU0RLIFN0dWJzOiAkQAogCSQoaGlkZSkgcm0gLXJmICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikKIAkkKGhpZGUpIG1rZGlyIC1wICQoUFJJVkFURV9DTEFTU19JTlRFUk1FRElBVEVTX0RJUikKZGlmZiAtLWdpdCBhL2J1aWxkL3Rvb2xzL21ha2Vfd2luZG93c19zZGsuc2ggYi9idWlsZC90b29scy9tYWtlX3dpbmRvd3Nfc2RrLnNoCmluZGV4IDdiNmExN2IuLjUyYzJmNmMgMTAwNzU1Ci0tLSBhL2J1aWxkL3Rvb2xzL21ha2Vfd2luZG93c19zZGsuc2gKKysrIGIvYnVpbGQvdG9vbHMvbWFrZV93aW5kb3dzX3Nkay5zaApAQCAtMSwxMSArMSwxNyBAQAogIyEvYmluL2Jhc2gKICMgUXVpY2sgc2VtaS1hdXRvIGZpbGUgdG8gYnVpbGQgV2luZG93cyBTREsgdG9vbHMuCiAjCi0jIExpbWl0YXRpb25zOgorIyBMaW1pdGF0aW9ucyBhbmQgcmVxdWlyZW1lbnRzOgogIyAtIEV4cGVjdHMgdGhlIGVtdWxhdG9yIGhhcyBiZWVuIGJ1aWx0IGZpcnN0LCB3aWxsIHBpY2sgaXQgdXAgZnJvbSBwcmVidWlsdC4KICMgLSBSdW4gaW4gQ3lnd2luCi0jIC0gTmVlZHMgQ3lnd2luIHBhY2thZ2UgemlwCiAjIC0gRXhwZWN0cyB0byBoYXZlIG9uZSBvZiB0aGUgZXhpc3RpbmcgU0RLIChEYXJ3aW4gb3IgTGludXgpIHRvIGJ1aWxkIHRoZSBXaW5kb3dzIG9uZQorIyAtIE5lZWRzIEN5Z3dpbiBwYWNrYWdlczogYXV0b2NvbmYsIGJpc29uLCBjdXJsLCBmbGV4LCBnY2MsIGcrKywgZ2l0LAorIyAgIGdudXBnLCBtYWtlLCBtaW5ndy16bGliLCBweXRob24sIHppcCwgdW56aXAKKyMgLSBNdXN0IE5PVCBoYXZlIGN5Z3dpbiBwYWNrYWdlIHJlYWRsaW5lIChpdHMgR1BMIGxpY2Vuc2UgbWlnaHQgdGFpbnQgdGhlIFNESyBpZgorIyAgIGl0IGdldHMgY29tcGlsZWQgaW4pCisjIC0gRG9lcyBub3QgbmVlZCBhIEphdmEgRGV2ZWxvcG1lbnQgS2l0IG9yIGFueSBvdGhlciB0b29scyBvdXRzaWRlIG9mIGN5Z3dpbi4KKyMgLSBJZiB5b3UgdGhpbmsgeW91IG1heSBoYXZlIFdpbmRvd3MgdmVyc2lvbnMgb2YgdG9vbHMgKGUuZy4gbWFrZSkgaW5zdGFsbGVkLCBpdCBtYXkKKyMgICByZWR1Y2UgY29uZnVzaW9uIGxldmVscyB0byAnZXhwb3J0IFBBVEg9L3Vzci9iaW4nCiAKIHNldCAtZSAgIyBGYWlsIHRoaXMgc2NyaXB0IGFzIHNvb24gYXMgYSBjb21tYW5kIGZhaWxzIC0tIGZhaWwgZWFybHksIGZhaWwgZmFzdAogCkBAIC01OSw2ICs2NSwxMCBAQAogICAgICAgICAjIFNESyBudW1iZXIgaWYgeW91IHdhbnQsIGJ1dCBub3QgYWZ0ZXIsIGUuZyB0aGVzZSBhcmUgdmFsaWQ6CiAgICAgICAgICMgICAgYW5kcm9pZF9zZGtfNDI0Ml9wbGF0Zm9ybS56aXAgb3IgYmxhaF80Ml8uemlwCiAgICAgICAgICMKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIHJvb3QgZGlyZWN0b3J5IG5hbWUgaW4gdGhlIHppcCBtdXN0IG1hdGNoIHRoZSB6aXAKKyAgICAgICAgIyBuYW1lLCB0b28sIHNvIHRoZXJlJ3Mgbm8gcG9pbnQganVzdCBjaGFuZ2luZyB0aGUgemlwIG5hbWUgdG8gbWF0Y2gKKyAgICAgICAgIyB0aGUgYWJvdmUgZm9ybWF0LgorICAgICAgICAjCiAgICAgICAgICMgU0RLX05VTUJFUiB3aWxsIGJlIGVtcHR5IGlmIG5vdGhpbmcgbWF0Y2hlZC4KICAgICAgICAgZmlsZW5hbWU9YGJhc2VuYW1lICIkU0RLX1pJUCJgCiAgICAgICAgIFNES19OVU1CRVI9YGVjaG8gJGZpbGVuYW1lIHwgc2VkIC1uICdzL14uKl9cKFteXy4vXVwrXClfW15fLl0qXC4uKiQvXDEvcCdgCmRpZmYgLS1naXQgYS9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsIGIvZW11bGF0b3Iva2V5bWFwcy9BVlJDUC5rbAppbmRleCBkMGViYTEwLi5hZWIzYzhhIDEwMDY0NAotLS0gYS9lbXVsYXRvci9rZXltYXBzL0FWUkNQLmtsCisrKyBiL2VtdWxhdG9yL2tleW1hcHMvQVZSQ1Aua2wKQEAgLTEsNiArMSw3IEBACi1rZXkgMTY0ICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCi1rZXkgMTI4ICAgTUVESUFfU1RPUCAgICAgICAgICBXQUtFCitrZXkgMjAwICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCitrZXkgMjAxICAgTUVESUFfUExBWV9QQVVTRSAgICBXQUtFCitrZXkgMTY2ICAgTUVESUFfU1RPUCAgICAgICAgICBXQUtFCiBrZXkgMTYzICAgTUVESUFfTkVYVCAgICAgICAgICBXQUtFCiBrZXkgMTY1ICAgTUVESUFfUFJFVklPVVMgICAgICBXQUtFCiBrZXkgMTY4ICAgTUVESUFfUkVXSU5EICAgICAgICBXQUtFCi1rZXkgMTU5ICAgTUVESUFfRkFTVF9GT1JXQVJEICBXQUtFCitrZXkgMjA4ICAgTUVESUFfRkFTVF9GT1JXQVJEICBXQUtFCmRpZmYgLS1naXQgYS9lbXVsYXRvci9xdG9vbHMvZG10cmFjZS5jcHAgYi9lbXVsYXRvci9xdG9vbHMvZG10cmFjZS5jcHAKaW5kZXggNmQ5MjUwYS4uYzQ4NmM1ZiAxMDA2NDQKLS0tIGEvZW11bGF0b3IvcXRvb2xzL2RtdHJhY2UuY3BwCisrKyBiL2VtdWxhdG9yL3F0b29scy9kbXRyYWNlLmNwcApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgImRtdHJhY2UuaCIKIAogc3RhdGljIGNvbnN0IHNob3J0IGtWZXJzaW9uID0gMjsKQEAgLTE2Myw3ICsxNjQsNyBAQAogICAgIC8vICAgc2lnID0gIigpSSIKIAogICAgIC8vIEZpbmQgdGhlIGZpcnN0IHBhcmVudGhlc2lzLCB0aGUgc3RhcnQgb2YgdGhlIHNpZ25hdHVyZS4KLSAgICBjaGFyICpwYXJlbiA9IHN0cmNocihuYW1lLCAnKCcpOworICAgIGNoYXIgKnBhcmVuID0gKGNoYXIqKXN0cmNocihuYW1lLCAnKCcpOwogCiAgICAgLy8gSWYgbm90IGZvdW5kLCB0aGVuIGFkZCB0aGUgb3JpZ2luYWwgbmFtZS4KICAgICBpZiAocGFyZW4gPT0gTlVMTCkgewpAQCAtMTgwLDcgKzE4MSw3IEBACiAgICAgKnBhcmVuID0gMDsKIAogICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhc3QgcGVyaW9kLCB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZCBuYW1lCi0gICAgY2hhciAqZG90ID0gc3RycmNocihuYW1lLCAnLicpOworICAgIGNoYXIgKmRvdCA9IChjaGFyKilzdHJyY2hyKG5hbWUsICcuJyk7CiAKICAgICAvLyBJZiBub3QgZm91bmQsIHRoZW4gYWRkIHRoZSBvcmlnaW5hbCBuYW1lLgogICAgIGlmIChkb3QgPT0gTlVMTCB8fCBkb3QgPT0gbmFtZSkgewpkaWZmIC0tZ2l0IGEvZW11bGF0b3IvcXRvb2xzL3RyYWNlX3JlYWRlci5jcHAgYi9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcAppbmRleCBkMmFmNjRmLi40N2I1ZDkzIDEwMDY0NAotLS0gYS9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcAorKysgYi9lbXVsYXRvci9xdG9vbHMvdHJhY2VfcmVhZGVyLmNwcApAQCAtMTAwOSwxMCArMTAwOSwxMCBAQAogLy8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlciBhZnRlciBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgogc3RhdGljIGNoYXIgKkV4dHJhY3REZXhQYXRoRnJvbU1tYXAoY29uc3QgY2hhciAqbW1hcF9wYXRoKQogewotICAgIGNoYXIgKmVuZCA9IHJpbmRleChtbWFwX3BhdGgsICdAJyk7CisgICAgY29uc3QgY2hhciAqZW5kID0gcmluZGV4KG1tYXBfcGF0aCwgJ0AnKTsKICAgICBpZiAoZW5kID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGNoYXIgKnN0YXJ0ID0gcmluZGV4KG1tYXBfcGF0aCwgJy8nKTsKKyAgICBjb25zdCBjaGFyICpzdGFydCA9IHJpbmRleChtbWFwX3BhdGgsICcvJyk7CiAgICAgaWYgKHN0YXJ0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGludCBsZW4gPSBlbmQgLSBzdGFydDsKZGlmZiAtLWdpdCBhL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGggYi9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCmluZGV4IDcxZThkMjkuLjk2Nzk3ZTcgMTAwNjQ0Ci0tLSBhL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKKysrIGIvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aApAQCAtMjgsOCArMjgsNiBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL3Byb3ZpZGVycy9JbVByb3ZpZGVyL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL3Byb3ZpZGVycy9NZWRpYVByb3ZpZGVyL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InBhY2thZ2VzL3Byb3ZpZGVycy9UZWxlcGhvbnlQcm92aWRlci9zcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2ZW5kb3IvZ29vZ2xlL2FwcHMvU3RyZWV0L3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InZlbmRvci9nb29nbGUvYXBwcy9Zb3VUdWJlL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9hd3QiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9hbS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9pbnB1dC9zcmMiLz4KQEAgLTM5LDYgKzM3LDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY29yZS9jb25maWcvc2RrIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2dyYXBoaWNzL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvaW0vamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9rZXlzdG9yZS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2xvY2F0aW9uL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9vcGVuZ2wvamF2YSIvPgpAQCAtNDksNiArNDgsNyBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS90ZWxlcGhvbnkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS90ZXN0LXJ1bm5lciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS90dHMvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS92cG4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS93aWZpL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL3BvbGljaWVzL2Jhc2UvcGhvbmUiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zYW1wbGVzL0FwaURlbW9zL3NyYyIvPgpAQCAtOTQsNyArOTQsNyBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRhbHZpay9saWJjb3JlL3gtbmV0L3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkYWx2aWsvbGliY29yZS94bWwvc3JjL21haW4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0FwaURlbW9zX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0Jyb3dzZXJfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvRW1haWxfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvSU1faW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvTXVzaWNfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvUGhvbmVfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CkBAIC0xMDQsNyArMTA0LDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2xvY2F0aW9uL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL21lZGlhL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3RlbGVwaG9ueS9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2ZyYW1ld29ya19pbnRlcm1lZGlhdGVzL3NyYy90dHMvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvdnBuL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3dpZmkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL1IiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC90YWdzb3VwL3NyYyIvPgpAQCAtMTE0LDYgKzExNCw2IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0iZXh0ZXJuYWwvZ29vZ2xlY2xpZW50L2dvb2dsZWNsaWVudC1saWIuamFyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2dvb2dsZS1mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9nb29nbGVsb2dpbi1jbGllbnRfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9InBhY2thZ2VzL2FwcHMvQ2FsY3VsYXRvci9hcml0eS0xLjMuMS5qYXIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJwYWNrYWdlcy9hcHBzL0NhbGN1bGF0b3IvYXJpdHktMS4zLjMuamFyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2FuZHJvaWRfc3R1YnNfY3VycmVudF9pbnRlcm1lZGlhdGVzL2NsYXNzZXMiLz4KIDwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGZiMzRhZmEuLjlkMjU1MTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTE1NjIsNiArMTU2MiwxMyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5ncmFwaGljcy5Db2xvckZpbHRlcnMiIGFuZHJvaWQ6bGFiZWw9IkdyYXBoaWNzL0NvbG9yRmlsdGVycyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmdyYXBoaWNzLkNyZWF0ZUJpdG1hcCIgYW5kcm9pZDpsYWJlbD0iR3JhcGhpY3MvQ3JlYXRlQml0bWFwIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19vZmYucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NoZWNrX29mZi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkMzg2MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19vZmYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaGVja19vbi5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWFjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS9idG5fY2hlY2tfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaXJjbGVfbm9ybWFsLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9jaXJjbGVfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVhZjFjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2NpcmNsZV9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL2J0bl9kZWZhdWx0X25vcm1hbC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ1Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvYnRuX2RlZmF1bHRfbm9ybWFsLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9ncmFwaGljcy9Db2xvckZpbHRlcnMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9ncmFwaGljcy9Db2xvckZpbHRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQxOGJhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2dyYXBoaWNzL0NvbG9yRmlsdGVycy5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuZ3JhcGhpY3M7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLio7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy4qOworCitwdWJsaWMgY2xhc3MgQ29sb3JGaWx0ZXJzIGV4dGVuZHMgR3JhcGhpY3NBY3Rpdml0eSB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhuZXcgU2FtcGxlVmlldyh0aGlzKSk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYW1wbGVWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgQWN0aXZpdHkgbUFjdGl2aXR5OworICAgICAgICBwcml2YXRlIERyYXdhYmxlIG1EcmF3YWJsZTsKKyAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZVtdIG1EcmF3YWJsZXM7CisgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIFBhaW50IG1QYWludDI7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVBhaW50VGV4dE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBtQ29sb3JzOworICAgICAgICBwcml2YXRlIFBvcnRlckR1ZmYuTW9kZVtdIG1Nb2RlczsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU1vZGVJbmRleDsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvVGhlUmlnaHQoRHJhd2FibGUgY3VyciwgRHJhd2FibGUgcHJldikgeworICAgICAgICAgICAgUmVjdCByID0gcHJldi5nZXRCb3VuZHMoKTsKKyAgICAgICAgICAgIGludCB4ID0gci5yaWdodCArIDEyOworICAgICAgICAgICAgaW50IGNlbnRlciA9IChyLnRvcCArIHIuYm90dG9tKSA+PiAxOworICAgICAgICAgICAgaW50IGggPSBjdXJyLmdldEludHJpbnNpY0hlaWdodCgpOworICAgICAgICAgICAgaW50IHkgPSBjZW50ZXIgLSAoaCA+PiAxKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY3Vyci5zZXRCb3VuZHMoeCwgeSwgeCArIGN1cnIuZ2V0SW50cmluc2ljV2lkdGgoKSwgeSArIGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNhbXBsZVZpZXcoQWN0aXZpdHkgYWN0aXZpdHkpIHsKKyAgICAgICAgICAgIHN1cGVyKGFjdGl2aXR5KTsKKyAgICAgICAgICAgIG1BY3Rpdml0eSA9IGFjdGl2aXR5OworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gYWN0aXZpdHk7CisgICAgICAgICAgICBzZXRGb2N1c2FibGUodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1EcmF3YWJsZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5idG5fZGVmYXVsdF9ub3JtYWwpOworICAgICAgICAgICAgbURyYXdhYmxlLnNldEJvdW5kcygwLCAwLCAxNTAsIDQ4KTsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXREaXRoZXIodHJ1ZSk7CisKKyAgICAgICAgICAgIGludFtdIHJlc0lEcyA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5idG5fY2lyY2xlX25vcm1hbCwKKyAgICAgICAgICAgICAgICBSLmRyYXdhYmxlLmJ0bl9jaGVja19vZmYsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5idG5fY2hlY2tfb24KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBtRHJhd2FibGVzID0gbmV3IERyYXdhYmxlW3Jlc0lEcy5sZW5ndGhdOworICAgICAgICAgICAgRHJhd2FibGUgcHJldiA9IG1EcmF3YWJsZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzSURzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbURyYXdhYmxlc1tpXSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUocmVzSURzW2ldKTsKKyAgICAgICAgICAgICAgICBtRHJhd2FibGVzW2ldLnNldERpdGhlcih0cnVlKTsKKyAgICAgICAgICAgICAgICBhZGRUb1RoZVJpZ2h0KG1EcmF3YWJsZXNbaV0sIHByZXYpOworICAgICAgICAgICAgICAgIHByZXYgPSBtRHJhd2FibGVzW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKKyAgICAgICAgICAgIG1QYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgICAgICAgICBtUGFpbnQuc2V0VGV4dFNpemUoMTYpOworICAgICAgICAgICAgbVBhaW50LnNldFRleHRBbGlnbihQYWludC5BbGlnbi5DRU5URVIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtUGFpbnQyID0gbmV3IFBhaW50KG1QYWludCk7CisgICAgICAgICAgICBtUGFpbnQyLnNldEFscGhhKDY0KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgUGFpbnQuRm9udE1ldHJpY3MgZm0gPSBtUGFpbnQuZ2V0Rm9udE1ldHJpY3MoKTsKKyAgICAgICAgICAgIG1QYWludFRleHRPZmZzZXQgPSAoZm0uZGVzY2VudCArIGZtLmFzY2VudCkgKiAwLjVmOworICAgICAgICAgICAgCisgICAgICAgICAgICBtQ29sb3JzID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIDB4Q0MwMDAwRkYsCisgICAgICAgICAgICAgICAgMHg4ODAwMDBGRiwKKyAgICAgICAgICAgICAgICAweDQ0MDAwMEZGLAorICAgICAgICAgICAgICAgIDB4RkZDQ0NDRkYsCisgICAgICAgICAgICAgICAgMHhGRjg4ODhGRiwKKyAgICAgICAgICAgICAgICAweEZGNDQ0NEZGLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgbU1vZGVzID0gbmV3IFBvcnRlckR1ZmYuTW9kZVtdIHsKKyAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0FUT1AsCisgICAgICAgICAgICAgICAgUG9ydGVyRHVmZi5Nb2RlLk1VTFRJUExZLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIG1Nb2RlSW5kZXggPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICB1cGRhdGVUaXRsZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwcml2YXRlIHZvaWQgc3dhcFBhaW50Q29sb3JzKCkgeworICAgICAgICAgICAgaWYgKG1QYWludC5nZXRDb2xvcigpID09IDB4RkYwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBtUGFpbnQuc2V0Q29sb3IoMHhGRkZGRkZGRik7CisgICAgICAgICAgICAgICAgbVBhaW50Mi5zZXRDb2xvcigweEZGMDAwMDAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4RkYwMDAwMDApOworICAgICAgICAgICAgICAgIG1QYWludDIuc2V0Q29sb3IoMHhGRkZGRkZGRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGFpbnQyLnNldEFscGhhKDY0KTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgeworICAgICAgICAgICAgbUFjdGl2aXR5LnNldFRpdGxlKG1Nb2Rlc1ttTW9kZUluZGV4XS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdTYW1wbGUoQ2FudmFzIGNhbnZhcywgQ29sb3JGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgICAgICBSZWN0IHIgPSBtRHJhd2FibGUuZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICBmbG9hdCB4ID0gKHIubGVmdCArIHIucmlnaHQpICogMC41ZjsKKyAgICAgICAgICAgIGZsb2F0IHkgPSAoci50b3AgKyByLmJvdHRvbSkgKiAwLjVmIC0gbVBhaW50VGV4dE9mZnNldDsKKworICAgICAgICAgICAgbURyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7CisgICAgICAgICAgICBtRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLmRyYXdUZXh0KCJMYWJlbCIsIHgrMSwgeSsxLCBtUGFpbnQyKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCgiTGFiZWwiLCB4LCB5LCBtUGFpbnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKERyYXdhYmxlIGRyIDogbURyYXdhYmxlcykgeworICAgICAgICAgICAgICAgIGRyLnNldENvbG9yRmlsdGVyKGZpbHRlcik7CisgICAgICAgICAgICAgICAgZHIuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Q29sb3IoMHhGRkNDQ0NDQyk7ICAgICAgICAgICAgCisKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoOCwgMTIpOworICAgICAgICAgICAgZm9yIChpbnQgY29sb3IgOiBtQ29sb3JzKSB7CisgICAgICAgICAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyOworICAgICAgICAgICAgICAgIGlmIChjb2xvciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcihjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW9kZXNbbU1vZGVJbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcmF3U2FtcGxlKGNhbnZhcywgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKDAsIDU1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGZsb2F0IHggPSBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpOworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRBY3Rpb24oKSkgeworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbW9kZSBldmVyeSBvdGhlciB0aW1lIHdlIGNoYW5nZSBwYWludCBjb2xvcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1QYWludC5nZXRDb2xvcigpID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2RlSW5kZXggPSAobU1vZGVJbmRleCArIDEpICUgbU1vZGVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dhcFBhaW50Q29sb3JzKCk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWQubWsgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA0N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIEJ1aWxkIGFwcGxpY2F0aW9uCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gU2FtcGxlQnJvd3NlclBsdWdpbgorCitMT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzYW1wbGVwbHVnaW4KKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQWxzbyBidWlsZCBhbGwgb2YgdGhlIHN1Yi10YXJnZXRzIHVuZGVyIHRoaXMgb25lOiB0aGUgc2hhcmVkIGxpYnJhcnkuCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNmI1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbiIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCisgICAgICBhbmRyb2lkOnZlcnNpb25OYW1lPSIxLjAiPgorCisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQud2Via2l0LnBlcm1pc3Npb24uUExVR0lOIi8+CisKKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3NhbXBsZV9icm93c2VyX3BsdWdpbiI+CisgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iU2FtcGxlUGx1Z2luIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLndlYmtpdC5QTFVHSU4iIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9OT1RJQ0UgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9BbmRyb2lkLm1rIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWNiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL0FuZHJvaWQubWsKQEAgLTAsMCArMSw2MSBAQAorIyMKKyMjCisjIyBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyMKKyMjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIyBhcmUgbWV0OgorIyMgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMjICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyMKKyMjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisjIyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyMjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyMgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorIyMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisjIyBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisjIyBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorIyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyMjCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJbWFpbi5jcHAgXAorCVBsdWdpbk9iamVjdC5jcHAgXAorCWFuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uY3BwIFwKKwlhdWRpby9BdWRpb1BsdWdpbi5jcHAgXAorCWJhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5jcHAgXAorCWZvcm0vRm9ybVBsdWdpbi5jcHAgXAorCXBhaW50L1BhaW50UGx1Z2luLmNwcCBcCisJc3VyZmFjZS9TdXJmYWNlUGx1Z2luLmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorCSQoTE9DQUxfUEFUSCkgXAorCSQoTE9DQUxfUEFUSCkvYW5pbWF0aW9uIFwKKwkkKExPQ0FMX1BBVEgpL2F1ZGlvIFwKKwkkKExPQ0FMX1BBVEgpL2JhY2tncm91bmQgXAorCSQoTE9DQUxfUEFUSCkvZm9ybSBcCisJJChMT0NBTF9QQVRIKS9wYWludCBcCisJJChMT0NBTF9QQVRIKS9zdXJmYWNlIFwKKwlleHRlcm5hbC93ZWJraXQvV2ViQ29yZS9icmlkZ2UgXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsdWdpbnMgXAorCWV4dGVybmFsL3dlYmtpdC9XZWJDb3JlL3BsYXRmb3JtL2FuZHJvaWQvSmF2YVZNIFwKKwlleHRlcm5hbC93ZWJraXQvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucworCitMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAKK0xPQ0FMX1BSRUxJTktfTU9EVUxFOj1mYWxzZQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKKworTE9DQUxfTU9EVUxFOj0gbGlic2FtcGxlcGx1Z2luCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgSU1QT1JUQU5UOiAgVGhpcyBBcHBsZSBzb2Z0d2FyZSBpcyBzdXBwbGllZCB0byB5b3UgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIGluCisgY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91ciB1c2UsIGluc3RhbGxhdGlvbiwKKyBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlCisgdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IKKyByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KKworIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QgdG8gdGhlc2UKKyB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbgorIHRoaXMgb3JpZ2luYWwgQXBwbGUgc29mdHdhcmUgKHRoZSAiQXBwbGUgU29mdHdhcmUiKSwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSBhbmQKKyByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkKKyBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQKKyBtb2RpZmljYXRpb25zLCB5b3UgbXVzdCByZXRhaW4gdGhpcyBub3RpY2UgYW5kIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgZGlzY2xhaW1lcnMgaW4gYWxsCisgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcworIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyB0aGUgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gRXhjZXB0IGFzIGV4cHJlc3NseQorIHN0YXRlZCBpbiB0aGlzIG5vdGljZSwgbm8gb3RoZXIgcmlnaHRzIG9yIGxpY2Vuc2VzLCBleHByZXNzIG9yIGltcGxpZWQsIGFyZSBncmFudGVkIGJ5IEFwcGxlCisgaGVyZWluLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGFueSBwYXRlbnQgcmlnaHRzIHRoYXQgbWF5IGJlIGluZnJpbmdlZCBieSB5b3VyCisgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KKworIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywKKyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULAorIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTCisgVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgorCisgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgICAgICAgICAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwKKyBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5ECisgV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUgorIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCitzdGF0aWMgdm9pZCBwbHVnaW5JbnZhbGlkYXRlKE5QT2JqZWN0ICpvYmopOworc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOworc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKK3N0YXRpYyBib29sIHBsdWdpbkdldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBOUFZhcmlhbnQgKnZhcmlhbnQpOworc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCk7CitzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOworc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcyk7CitzdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopOworc3RhdGljIGJvb2wgcGx1Z2luUmVtb3ZlUHJvcGVydHkoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7CitzdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KTsKKworCisKK3N0YXRpYyBOUENsYXNzIHBsdWdpbkNsYXNzID0geworICAgIE5QX0NMQVNTX1NUUlVDVF9WRVJTSU9OLAorICAgIHBsdWdpbkFsbG9jYXRlLAorICAgIHBsdWdpbkRlYWxsb2NhdGUsCisgICAgcGx1Z2luSW52YWxpZGF0ZSwKKyAgICBwbHVnaW5IYXNNZXRob2QsCisgICAgcGx1Z2luSW52b2tlLAorICAgIHBsdWdpbkludm9rZURlZmF1bHQsCisgICAgcGx1Z2luSGFzUHJvcGVydHksCisgICAgcGx1Z2luR2V0UHJvcGVydHksCisgICAgcGx1Z2luU2V0UHJvcGVydHksCisgICAgcGx1Z2luUmVtb3ZlUHJvcGVydHksCisgICAgcGx1Z2luRW51bWVyYXRlCit9OworCitOUENsYXNzICpnZXRQbHVnaW5DbGFzcyh2b2lkKQoreworICAgIHJldHVybiAmcGx1Z2luQ2xhc3M7Cit9CisKK3N0YXRpYyBib29sIGlkZW50aWZpZXJzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworI2RlZmluZSBJRF9URVNURklMRV9QUk9QRVJUWSAgICAgICAgICAgIDAKKyNkZWZpbmUgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTICAgICAgICAxCisKK3N0YXRpYyBOUElkZW50aWZpZXIgcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tOVU1fUFJPUEVSVFlfSURFTlRJRklFUlNdOworc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyTmFtZXNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXSA9IHsKKyAgICAidGVzdGZpbGUiCit9OworCisjZGVmaW5lIElEX0dFVFRFU1RGSUxFX01FVEhPRCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE5VTV9NRVRIT0RfSURFTlRJRklFUlMgICAgICAgICAgICAgICAgICAxCisKK3N0YXRpYyBOUElkZW50aWZpZXIgcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbTlVNX01FVEhPRF9JREVOVElGSUVSU107CitzdGF0aWMgY29uc3QgTlBVVEY4ICpwbHVnaW5NZXRob2RJZGVudGlmaWVyTmFtZXNbTlVNX01FVEhPRF9JREVOVElGSUVSU10gPSB7CisgICAgImdldFRlc3RGaWxlIgorfTsKKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUlkZW50aWZpZXJzKHZvaWQpCit7CisgICAgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcnMocGx1Z2luUHJvcGVydHlJZGVudGlmaWVyTmFtZXMsIE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUywgcGx1Z2luUHJvcGVydHlJZGVudGlmaWVycyk7CisgICAgYnJvd3Nlci0+Z2V0c3RyaW5naWRlbnRpZmllcnMocGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzLCBOVU1fTUVUSE9EX0lERU5USUZJRVJTLCBwbHVnaW5NZXRob2RJZGVudGlmaWVycyk7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkhhc1Byb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlM7IGkrKykKKyAgICAgICAgaWYgKG5hbWUgPT0gcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tpXSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUVUSE9EX0lERU5USUZJRVJTOyBpKyspCisgICAgICAgIGlmIChuYW1lID09IHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW2ldKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5HZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgTlBWYXJpYW50ICp2YXJpYW50KQoreworICAgIFBsdWdpbk9iamVjdCAqcGx1Z2luID0gKFBsdWdpbk9iamVjdCAqKW9iajsKKyAgICBpZiAobmFtZSA9PSBwbHVnaW5Qcm9wZXJ0eUlkZW50aWZpZXJzW0lEX1RFU1RGSUxFX1BST1BFUlRZXSkgeworICAgICAgICBCT09MRUFOX1RPX05QVkFSSUFOVCh0cnVlLCAqdmFyaWFudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpblNldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKnZhcmlhbnQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KQoreworICAgIFBsdWdpbk9iamVjdCAqcGx1Z2luID0gKFBsdWdpbk9iamVjdCAqKW9iajsKKyAgICBpZiAobmFtZSA9PSBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tJRF9HRVRURVNURklMRV9NRVRIT0RdKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5JbnZhbGlkYXRlKE5QT2JqZWN0ICpvYmopCit7CisgICAgLy8gUmVsZWFzZSBhbnkgcmVtYWluaW5nIHJlZmVyZW5jZXMgdG8gSmF2YVNjcmlwdCBvYmplY3RzLgorfQorCitzdGF0aWMgTlBPYmplY3QgKnBsdWdpbkFsbG9jYXRlKE5QUCBucHAsIE5QQ2xhc3MgKnRoZUNsYXNzKQoreworICAgIFBsdWdpbk9iamVjdCAqbmV3SW5zdGFuY2UgPSAoUGx1Z2luT2JqZWN0KikgbWFsbG9jKHNpemVvZihQbHVnaW5PYmplY3QpKTsKKyAgICBuZXdJbnN0YW5jZS0+aGVhZGVyLl9jbGFzcyA9IHRoZUNsYXNzOworICAgIG5ld0luc3RhbmNlLT5oZWFkZXIucmVmZXJlbmNlQ291bnQgPSAxOworCisgICAgaWYgKCFpZGVudGlmaWVyc0luaXRpYWxpemVkKSB7CisgICAgICAgIGlkZW50aWZpZXJzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBpbml0aWFsaXplSWRlbnRpZmllcnMoKTsKKyAgICB9CisKKyAgICBuZXdJbnN0YW5jZS0+bnBwID0gbnBwOworCisgICAgcmV0dXJuICZuZXdJbnN0YW5jZS0+aGVhZGVyOworfQorCitzdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopCit7CisgICAgZnJlZShvYmopOworfQorCitzdGF0aWMgYm9vbCBwbHVnaW5SZW1vdmVQcm9wZXJ0eShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciBuYW1lKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgcGx1Z2luRW51bWVyYXRlKE5QT2JqZWN0ICpucG9iaiwgTlBJZGVudGlmaWVyICoqdmFsdWUsIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhhMDliCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaApAQCAtMCwwICsxLDc1IEBACisvKgorIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgorIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sCisgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZQorIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yCisgcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCisKKyBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlCisgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4KKyB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kCisgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5CisgZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0CisgbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbAorIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MKKyBvciBsb2dvcyBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgdGhlIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuIEV4Y2VwdCBhcyBleHByZXNzbHkKKyBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQorIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91cgorIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCisKKyBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PIFdBUlJBTlRJRVMsCisgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwKKyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEFQUExFIFNPRlRXQVJFIE9SIElUUworIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KKworIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKKyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsCisgUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORAorIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IKKyBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBQbHVnaW5PYmplY3RfX0RFRklORUQKKyNkZWZpbmUgUGx1Z2luT2JqZWN0X19ERUZJTkVECisKKyNpbmNsdWRlICJtYWluLmgiCisKK2NsYXNzIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQorICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCkgPSAwOworCisgICAgTlBQIGluc3QoKSBjb25zdCB7IHJldHVybiBtX2luc3Q7IH0KKworcHJpdmF0ZToKKyAgICBOUFAgbV9pbnN0OworfTsKKworZW51bSBQbHVnaW5UeXBlcyB7CisgICAga0FuaW1hdGlvbl9QbHVnaW5UeXBlICA9IDEsCisgICAga0F1ZGlvX1BsdWdpblR5cGUgICAgICA9IDIsCisgICAga0JhY2tncm91bmRfUGx1Z2luVHlwZSA9IDMsCisgICAga0Zvcm1fUGx1Z2luVHlwZSAgICAgICA9IDQsCisgICAga1RleHRfUGx1Z2luVHlwZSAgICAgICA9IDUsCisgICAga1BhaW50X1BsdWdpblR5cGUgICAgICA9IDYsCisgICAga1N1cmZhY2VfUGx1Z2luVHlwZSAgICA9IDcsCit9OwordHlwZWRlZiB1aW50MzJfdCBQbHVnaW5UeXBlOworCit0eXBlZGVmIHN0cnVjdCBQbHVnaW5PYmplY3QgeworICAgIE5QT2JqZWN0IGhlYWRlcjsKKyAgICBOUFAgbnBwOworICAgIE5QV2luZG93KiB3aW5kb3c7CisKKyAgICBQbHVnaW5UeXBlIHBsdWdpblR5cGU7CisgICAgU3ViUGx1Z2luKiBhY3RpdmVQbHVnaW47CisKK30gUGx1Z2luT2JqZWN0OworCitOUENsYXNzICpnZXRQbHVnaW5DbGFzcyh2b2lkKTsKKworI2VuZGlmIC8vIFBsdWdpbk9iamVjdF9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiQW5pbWF0aW9uUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICBnUGF0aEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKK2V4dGVybiBBTlBXaW5kb3dJbnRlcmZhY2VWMCAgICBnV2luZG93STsKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKK30KKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CisgICAgY29uc3QgaW50IGluc2V0ID0gZG9BQSA/IC0xIDogMDsKKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIE5QUmVjdCBpbnZhbDsKKyAgICBpbnZhbC5sZWZ0ID0gcm5kMTYoci5sZWZ0LCBpbnNldCk7CisgICAgaW52YWwudG9wID0gcm5kMTYoci50b3AsIGluc2V0KTsKKyAgICBpbnZhbC5yaWdodCA9IHJuZDE2KHIucmlnaHQsIC1pbnNldCk7CisgICAgaW52YWwuYm90dG9tID0gcm5kMTYoci5ib3R0b20sIC1pbnNldCk7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsICZpbnZhbCk7Cit9CisKK3VpbnQzMl90IGdldE1TZWNzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHJldHVybiAodWludDMyX3QpICh0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDAgKTsgLy8gbWljcm9zZWNvbmRzIHRvIG1pbGxpc2Vjb25kcworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhbGxBbmltYXRpb246OkJhbGxBbmltYXRpb24oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKyAgICBtX3ggPSBtX3kgPSAwOworICAgIG1fZHggPSA3ICogU0NBTEU7CisgICAgbV9keSA9IDUgKiBTQ0FMRTsKKworICAgIG1lbXNldCgmbV9vdmFsLCAwLCBzaXplb2YobV9vdmFsKSk7CisKKyAgICBtX3BhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkZGRjAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludCwgMjQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludCwgdGYpOworICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOworCisgICAgLy9yZWdpc3RlciBmb3Iga2V5IGFuZCB0b3VjaCBldmVudHMKKyAgICBBTlBFdmVudEZsYWdzIGZsYWdzID0ga0tleV9BTlBFdmVudEZsYWcgfCBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitCYWxsQW5pbWF0aW9uOjp+QmFsbEFuaW1hdGlvbigpIHsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnQpOworfQorCitzdGF0aWMgdm9pZCBib3VuY2UoZmxvYXQqIHgsIGZsb2F0KiBkeCwgY29uc3QgZmxvYXQgbWF4KSB7CisgICAgKnggKz0gKmR4OworICAgIGlmICgqeCA8IDApIHsKKyAgICAgICAgKnggPSAwOworICAgICAgICBpZiAoKmR4IDwgMCkgeworICAgICAgICAgICAgKmR4ID0gLSpkeDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKnggPiBtYXgpIHsKKyAgICAgICAgKnggPSBtYXg7CisgICAgICAgIGlmICgqZHggPiAwKSB7CisgICAgICAgICAgICAqZHggPSAtKmR4OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJhbGxBbmltYXRpb246OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEJhbGxBbmltYXRpb246OmRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7CisKKyAgICBBTlBSZWN0RiBjbGlwUjsKKyAgICBjbGlwUi5sZWZ0ID0gY2xpcC5sZWZ0OworICAgIGNsaXBSLnRvcCA9IGNsaXAudG9wOworICAgIGNsaXBSLnJpZ2h0ID0gY2xpcC5yaWdodDsKKyAgICBjbGlwUi5ib3R0b20gPSBjbGlwLmJvdHRvbTsKKyAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisKKyAgICBkcmF3KGNhbnZhcyk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Cit9CisKK3ZvaWQgQmFsbEFuaW1hdGlvbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgY29uc3QgZmxvYXQgT1cgPSAyMDsKKyAgICBjb25zdCBmbG9hdCBPSCA9IDIwOworICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKworICAgIGludmFsKGluc3RhbmNlLCBtX292YWwsIHRydWUpOyAgLy8gaW52YWwgdGhlIG9sZAorICAgIG1fb3ZhbC5sZWZ0ID0gbV94OworICAgIG1fb3ZhbC50b3AgPSBtX3k7CisgICAgbV9vdmFsLnJpZ2h0ID0gbV94ICsgT1c7CisgICAgbV9vdmFsLmJvdHRvbSA9IG1feSArIE9IOworICAgIGludmFsKGluc3RhbmNlLCBtX292YWwsIHRydWUpOyAgLy8gaW52YWwgdGhlIG5ldworCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgMHhGRkZGRkZGRik7CisKKyAgICAvLyB0ZXN0IG91dCB0aGUgUGF0aCBBUEkKKyAgICB7CisgICAgICAgIEFOUFBhdGgqIHBhdGggPSBnUGF0aEkubmV3UGF0aCgpOworCisgICAgICAgIGZsb2F0IGN4ID0gVyAqIDAuNWY7CisgICAgICAgIGZsb2F0IGN5ID0gSCAqIDAuNWY7CisgICAgICAgIGdQYXRoSS5tb3ZlVG8ocGF0aCwgMCwgMCk7CisgICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCBXLCAwKTsKKyAgICAgICAgZ1BhdGhJLnF1YWRUbyhwYXRoLCBjeCwgY3ksIFcsIEgpOworICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgMCwgSCk7CisgICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCAwLCAwKTsKKworICAgICAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkYwMDAwRkYpOworICAgICAgICBnQ2FudmFzSS5kcmF3UGF0aChjYW52YXMsIHBhdGgsIG1fcGFpbnQpOworCisgICAgICAgIEFOUFJlY3RGIGJvdW5kczsKKyAgICAgICAgbWVtc2V0KCZib3VuZHMsIDAsIHNpemVvZihib3VuZHMpKTsKKyAgICAgICAgZ1BhdGhJLmdldEJvdW5kcyhwYXRoLCAmYm91bmRzKTsKKyNpZiAwCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJkcmF3cGF0aDogY2VudGVyICVnICVnIGJvdW5kcyBbJWcgJWcgJWcgJWddXG4iLAorICAgICAgICAgICAgICAgICAgY3gsIGN5LAorICAgICAgICAgICAgICAgICAgYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisjZW5kaWYKKyAgICAgICAgZ1BhdGhJLmRlbGV0ZVBhdGgocGF0aCk7CisgICAgfQorCisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGRkYwMDAwKTsKKyAgICBnQ2FudmFzSS5kcmF3T3ZhbChjYW52YXMsICZtX292YWwsIG1fcGFpbnQpOworCisgICAgYm91bmNlKCZtX3gsICZtX2R4LCBvYmotPndpbmRvdy0+d2lkdGggLSBPVyk7CisgICAgYm91bmNlKCZtX3ksICZtX2R5LCBvYmotPndpbmRvdy0+aGVpZ2h0IC0gT0gpOworCisgICAgaWYgKG1VbmljaGFyKSB7CisgICAgICAgIEFOUEZvbnRNZXRyaWNzIGZtOworICAgICAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnQsICZmbSk7CisKKyAgICAgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGMDAwMEZGKTsKKyAgICAgICAgY2hhciBjID0gc3RhdGljX2Nhc3Q8Y2hhcj4obVVuaWNoYXIpOworICAgICAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsICZjLCAxLCAxMCwgLWZtLmZUb3AsIG1fcGFpbnQpOworICAgIH0KK30KKwordm9pZCBCYWxsQW5pbWF0aW9uOjpzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKyAgICBOUFdpbmRvdyAqd2luZG93ID0gb2JqLT53aW5kb3c7CisKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdHNbMV07CisKKyAgICB2aXNpYmxlUmVjdHNbMF0ubGVmdCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnRvcCA9IDA7CisgICAgdmlzaWJsZVJlY3RzWzBdLnJpZ2h0ID0gd2luZG93LT53aWR0aDsKKyAgICB2aXNpYmxlUmVjdHNbMF0uYm90dG9tID0gd2luZG93LT5oZWlnaHQ7CisKKyAgICBnV2luZG93SS5zZXRWaXNpYmxlUmVjdHMoaW5zdGFuY2UsIHZpc2libGVSZWN0cywgMSk7CisgICAgZ1dpbmRvd0kuY2xlYXJWaXNpYmxlUmVjdHMoaW5zdGFuY2UpOworfQorCitpbnQxNiBCYWxsQW5pbWF0aW9uOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5LmFjdGlvbiA9PSBrRG93bl9BTlBLZXlBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtVW5pY2hhciA9IGV2dC0+ZGF0YS5rZXkudW5pY2hhcjsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiYmFsbCBkb3dua2V5IGV2ZW50Iik7CisgICAgICAgICAgICAgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgICBpZiAoa0Rvd25fQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgICBzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0NTNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKKyNkZWZpbmUgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKKworY2xhc3MgQmFsbEFuaW1hdGlvbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEJhbGxBbmltYXRpb24oTlBQIGluc3QpOworICAgIHZpcnR1YWwgfkJhbGxBbmltYXRpb24oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKTsKKyAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXcoQU5QQ2FudmFzKik7CisgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CisgICAgdm9pZCBzaG93RW50aXJlUGx1Z2luT25TY3JlZW4oKTsKKworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBtX3k7CisgICAgZmxvYXQgbV9keDsKKyAgICBmbG9hdCBtX2R5OworCisgICAgaW50MzJfdCBtVW5pY2hhcjsKKworICAgIEFOUFJlY3RGICAgIG1fb3ZhbDsKKyAgICBBTlBQYWludCogICBtX3BhaW50OworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IFNDQUxFID0gMC4xOworfTsKKwordWludDMyX3QgZ2V0TVNlY3MoKTsKKworI2VuZGlmIC8vIHBsdWdpbkdyYXBoaWNzX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDM0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwIGdTb3VuZEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CisKKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlKSB7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsIE5VTEwpOworfQorCitzdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CisgICAgaWYgKGl4IDwgMCkgeworICAgICAgICBpeCA9IDA7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKK30KKworc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CisgICAgY29uc3QgaW50IGluc2V0ID0gZG9BQSA/IC0xIDogMDsKKworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOworICAgIE5QUmVjdCBpbnZhbDsKKyAgICBpbnZhbC5sZWZ0ID0gcm5kMTYoci5sZWZ0LCBpbnNldCk7CisgICAgaW52YWwudG9wID0gcm5kMTYoci50b3AsIGluc2V0KTsKKyAgICBpbnZhbC5yaWdodCA9IHJuZDE2KHIucmlnaHQsIC1pbnNldCk7CisgICAgaW52YWwuYm90dG9tID0gcm5kMTYoci5ib3R0b20sIC1pbnNldCk7CisgICAgYnJvd3Nlci0+aW52YWxpZGF0ZXJlY3QoaW5zdGFuY2UsICZpbnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvQ2FsbGJhY2soQU5QQXVkaW9FdmVudCBldnQsIHZvaWQqIHVzZXIsIEFOUEF1ZGlvQnVmZmVyKiBidWZmZXIpIHsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgICAgICBjYXNlIGtNb3JlRGF0YV9BTlBBdWRpb0V2ZW50OiB7CisgICAgICAgICAgICBTb3VuZFBsYXkqIHBsYXkgPSByZWludGVycHJldF9jYXN0PFNvdW5kUGxheSo+KHVzZXIpOworICAgICAgICAgICAgc2l6ZV90IGFtb3VudCA9IGZyZWFkKGJ1ZmZlci0+YnVmZmVyRGF0YSwgMSwgYnVmZmVyLT5zaXplLCBwbGF5LT5maWxlKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFtb3VudDsKKyAgICAgICAgICAgIGlmIChhbW91bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdTb3VuZEkuc3RvcChwbGF5LT50cmFjayk7CisgICAgICAgICAgICAgICAgZmNsb3NlKHBsYXktPmZpbGUpOworICAgICAgICAgICAgICAgIHBsYXktPmZpbGUgPSBOVUxMOworICAgICAgICAgICAgICAgIC8vIFRPRE8gbmVlZCB0byBub3RpZnkgb3VyIG1haW4gdGhyZWFkIHRvIGRlbGV0ZSB0aGUgdHJhY2sgbm93CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwbGF5LT5maWxlU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIHdlIG5lZWQgdG8gcHJvcGVybHkgdXBkYXRlIHRoZSBwcm9ncmVzcyB2YWx1ZQorICAgICAgICAgICAgICAgIHBsYXktPnByb2dyZXNzID0gMTsKKyAgICAgICAgICAgICAgICBpbnZhbChwbGF5LT5pbnN0YW5jZSk7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitBdWRpb1BsdWdpbjo6QXVkaW9QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIGNvbnN0IGNoYXIgcGF0aFtdID0gIi9zZGNhcmQvc2FtcGxlLnJhdyI7CisKKyAgICAvLyBvcGVuIGEgZmlsZSBzdHJlYW0KKyAgICBGSUxFKiBmID0gZm9wZW4ocGF0aCwgInIiKTsKKyAgICBnTG9nSS5sb2coaW5zdCwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0gcGF0aCAlcyBGSUxFICVwIiwgcGF0aCwgZik7CisKKyAgICAvLyBzZXR1cCBvdXIgcHJpdmF0ZSBhdWRpbyBzdHJ1Y3QncyBkZWZhdWx0IHZhbHVlcworICAgIG1fc291bmRQbGF5ID0gbmV3IFNvdW5kUGxheTsKKyAgICBtX3NvdW5kUGxheS0+aW5zdGFuY2UgPSBpbnN0OworICAgIG1fc291bmRQbGF5LT5wcm9ncmVzcyA9IDA7CisgICAgbV9zb3VuZFBsYXktPmZpbGVTaXplID0gMDsKKyAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IGY7CisgICAgbV9zb3VuZFBsYXktPnRyYWNrID0gTlVMTDsKKworICAgIC8vIGNyZWF0ZSB0aGUgYXVkaW8gdHJhY2sKKyAgICBpZiAoZikgeworICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2sgPSBnU291bmRJLm5ld1RyYWNrKDQ0MTAwLCBrUENNMTZCaXRfQU5QU2FtcGxlRm9ybWF0LCAyLCBhdWRpb0NhbGxiYWNrLCBtX3NvdW5kUGxheSk7CisgICAgICAgIGlmICghbV9zb3VuZFBsYXktPnRyYWNrKSB7CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBnZXQgdGhlIGF1ZGlvIGZpbGUncyBzaXplCisgICAgaW50IGZpbGVEZXNjcmlwdG9yID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisgICAgc3RydWN0IHN0YXQgZmlsZVN0YXR1czsKKworICAgIGlmKGZpbGVEZXNjcmlwdG9yIDw9IDApIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZm9wZW4gZXJyb3IiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnN0YXQoZmlsZURlc2NyaXB0b3IsICZmaWxlU3RhdHVzKSAhPSAwKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRGVidWdfQU5QTG9nVHlwZSwgIkZpbGUgU2l6ZTogJWQiLCBmaWxlU3RhdHVzLnN0X3NpemUpOworICAgICAgICBtX3NvdW5kUGxheS0+ZmlsZVNpemUgPSBmaWxlU3RhdHVzLnN0X3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiZnN0YXQgZXJyb3IiKTsKKyAgICB9CisKKyAgICAvLyBjb25maWd1cmUgdGhlIFVJIGVsZW1lbnRzCisgICAgbV9hY3RpdmVUb3VjaCA9IGZhbHNlOworCisgICAgbWVtc2V0KCZtX3RyYWNrUmVjdCwgMCwgc2l6ZW9mKG1fdHJhY2tSZWN0KSk7CisgICAgbWVtc2V0KCZtX3BsYXlSZWN0LCAgMCwgc2l6ZW9mKG1fcGxheVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fcGF1c2VSZWN0LCAwLCBzaXplb2YobV9wYXVzZVJlY3QpKTsKKyAgICBtZW1zZXQoJm1fc3RvcFJlY3QsICAwLCBzaXplb2YobV9zdG9wUmVjdCkpOworCisgICAgbV9wYWludFRyYWNrID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRyYWNrLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFjaykgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50VHJhY2ssIDB4RkZDMEMwQzApOworCisgICAgbV9wYWludFJlY3QgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50UmVjdCwgZ1BhaW50SS5nZXRGbGFncyhtX3BhaW50UmVjdCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50UmVjdCwgMHhGRkE4QThBOCk7CisKKyAgICBtX3BhaW50VGV4dCA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUZXh0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUZXh0KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUZXh0LCAweEZGMkY0RjRGKTsKKyAgICBnUGFpbnRJLnNldFRleHRTaXplKG1fcGFpbnRUZXh0LCAxOCk7CisKKyAgICBtX3BhaW50VHJhY2tQcm9ncmVzcyA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRUcmFja1Byb2dyZXNzKSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnRUcmFja1Byb2dyZXNzLCAweEZGNTQ1NDU0KTsKKworICAgIG1fcGFpbnRBY3RpdmVSZWN0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZVJlY3QpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludEFjdGl2ZVJlY3QsIDB4RkY1NDU0NTQpOworCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludFRleHQsIHRmKTsKKyAgICBnVHlwZWZhY2VJLnVucmVmKHRmKTsKKworICAgIC8vcmVnaXN0ZXIgZm9yIHRvdWNoIGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitBdWRpb1BsdWdpbjo6fkF1ZGlvUGx1Z2luKCkgeworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludFRyYWNrKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRSZWN0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUZXh0KTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRUcmFja1Byb2dyZXNzKTsKKyAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnRBY3RpdmVSZWN0KTsKKyAgICBpZihtX3NvdW5kUGxheS0+dHJhY2spCisgICAgICAgIGdTb3VuZEkuZGVsZXRlVHJhY2sobV9zb3VuZFBsYXktPnRyYWNrKTsKKyAgICBkZWxldGUgbV9zb3VuZFBsYXk7Cit9CisKK2Jvb2wgQXVkaW9QbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCkgeworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKKyAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKKyAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7CisgICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207CisgICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOworCisgICAgZHJhdyhjYW52YXMpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJEcmF3aW5nIik7CisKKyAgICBjb25zdCBmbG9hdCB0cmFja0hlaWdodCA9IDMwOworICAgIGNvbnN0IGZsb2F0IGJ1dHRvbldpZHRoID0gNjA7CisgICAgY29uc3QgZmxvYXQgYnV0dG9uSGVpZ2h0ID0gMzA7CisgICAgY29uc3QgaW50IFcgPSBvYmotPndpbmRvdy0+d2lkdGg7CisgICAgY29uc3QgaW50IEggPSBvYmotPndpbmRvdy0+aGVpZ2h0OworCisgICAgLy8gY29sb3IgdGhlIHBsdWdpbiBjYW52YXMKKyAgICBnQ2FudmFzSS5kcmF3Q29sb3IoY2FudmFzLCAweEZGQ0RDRENEKTsKKworICAgIC8vIGdldCBmb250IG1ldHJpY3MKKyAgICBBTlBGb250TWV0cmljcyBmb250TWV0cmljczsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnRUZXh0LCAmZm9udE1ldHJpY3MpOworCisgICAgLy8gZHJhdyB0aGUgdHJhY2sgYm94ICgxIHB4IGZyb20gdGhlIGVkZ2UpCisgICAgbV90cmFja1JlY3QubGVmdCA9IDE7CisgICAgbV90cmFja1JlY3QudG9wID0gMTsKKyAgICBtX3RyYWNrUmVjdC5yaWdodCA9IFcgLSAyOworICAgIG1fdHJhY2tSZWN0LmJvdHRvbSA9IDEgKyB0cmFja0hlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrKTsKKworICAgIC8vIGRyYXcgdGhlIHByb2dyZXNzIGJhcgorICAgIGlmIChtX3NvdW5kUGxheS0+cHJvZ3Jlc3MgPiAwKSB7CisgICAgICAgIC8vIFRPRE8gbmVlZCB0byBkcmF3IHByb2dyZXNzIGJhciB0byBjb3ZlciB0aGUgcHJvcGVyIHBlcmNlbnRhZ2Ugb2YgdGhlIHRyYWNrIGJhcgorICAgICAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3RyYWNrUmVjdCwgbV9wYWludFRyYWNrUHJvZ3Jlc3MpOworICAgIH0KKworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgbV9wbGF5UmVjdC5sZWZ0ID0gbV90cmFja1JlY3QubGVmdCArIDU7CisgICAgbV9wbGF5UmVjdC50b3AgPSBtX3RyYWNrUmVjdC5ib3R0b20gKyAxMDsKKyAgICBtX3BsYXlSZWN0LnJpZ2h0ID0gbV9wbGF5UmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wbGF5UmVjdC5ib3R0b20gPSBtX3BsYXlSZWN0LnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3BsYXlSZWN0LCBnZXRQYWludCgmbV9wbGF5UmVjdCkpOworICAgIC8vIGRyYXcgdGhlIHBsYXkgYm94ICh1bmRlciB0cmFjayBib3gpCisgICAgY29uc3QgY2hhciBwbGF5VGV4dFtdID0gIlBsYXkiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgcGxheVRleHQsIHNpemVvZihwbGF5VGV4dCktMSwgbV9wbGF5UmVjdC5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3BsYXlSZWN0LnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRUZXh0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhdXNlIGJveCAodW5kZXIgdHJhY2sgYm94KQorICAgIG1fcGF1c2VSZWN0LmxlZnQgPSBtX3BsYXlSZWN0LnJpZ2h0ICsgMjA7CisgICAgbV9wYXVzZVJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9wYXVzZVJlY3QucmlnaHQgPSBtX3BhdXNlUmVjdC5sZWZ0ICsgYnV0dG9uV2lkdGg7CisgICAgbV9wYXVzZVJlY3QuYm90dG9tID0gbV9wYXVzZVJlY3QudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1fcGF1c2VSZWN0LCBnZXRQYWludCgmbV9wYXVzZVJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHBhdXNlVGV4dFtdID0gIlBhdXNlIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIHBhdXNlVGV4dCwgc2l6ZW9mKHBhdXNlVGV4dCktMSwgbV9wYXVzZVJlY3QubGVmdCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgbV9wYXVzZVJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworCisgICAgLy8gZHJhdyB0aGUgc3RvcCBib3ggKHVuZGVyIHRyYWNrIGJveCkKKyAgICBtX3N0b3BSZWN0LmxlZnQgPSBtX3BhdXNlUmVjdC5yaWdodCArIDIwOworICAgIG1fc3RvcFJlY3QudG9wID0gbV90cmFja1JlY3QuYm90dG9tICsgMTA7CisgICAgbV9zdG9wUmVjdC5yaWdodCA9IG1fc3RvcFJlY3QubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fc3RvcFJlY3QuYm90dG9tID0gbV9zdG9wUmVjdC50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9zdG9wUmVjdCwgZ2V0UGFpbnQoJm1fc3RvcFJlY3QpKTsKKyAgICAvLyBkcmF3IHRoZSB0ZXh0IGluIHRoZSBwYXVzZSBib3gKKyAgICBjb25zdCBjaGFyIHN0b3BUZXh0W10gPSAiU3RvcCI7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBzdG9wVGV4dCwgc2l6ZW9mKHN0b3BUZXh0KS0xLCBtX3N0b3BSZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fc3RvcFJlY3QudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFRleHQpOworfQorCitBTlBQYWludCogQXVkaW9QbHVnaW46OmdldFBhaW50KEFOUFJlY3RGKiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVSZWN0KSA/IG1fcGFpbnRBY3RpdmVSZWN0IDogbV9wYWludFJlY3Q7Cit9CisKK2ludDE2IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgeworICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXcubW9kZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtCaXRtYXBfQU5QRHJhd2luZ01vZGVsOgorICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrVG91Y2hfQU5QRXZlbnRUeXBlOiB7CisgICAgICAgICAgICBpbnQgeCA9IGV2dC0+ZGF0YS50b3VjaC54OworICAgICAgICAgICAgaW50IHkgPSBldnQtPmRhdGEudG91Y2gueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uKSB7CisKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoUmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICAgICAgICAgICAgICBpZihtX2FjdGl2ZVRvdWNoUmVjdCkgeworICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGtVcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1fYWN0aXZlVG91Y2gpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVUb3VjaCh4LCB5KTsKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVRvdWNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtDYW5jZWxfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlVG91Y2ggPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKwordm9pZCBBdWRpb1BsdWdpbjo6aW52YWxBY3RpdmVSZWN0KCkgeworCit9CisKK0FOUFJlY3RGKiBBdWRpb1BsdWdpbjo6dmFsaWRUb3VjaChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmIChtX3BsYXlSZWN0LmxlZnQgJiYgeCA8IG1fcGxheVJlY3QucmlnaHQgJiYgeSA+IG1fcGxheVJlY3QudG9wICYmIHkgPCBtX3BsYXlSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BsYXlSZWN0OworICAgIGVsc2UgaWYgKG1fcGF1c2VSZWN0LmxlZnQgJiYgeCA8IG1fcGF1c2VSZWN0LnJpZ2h0ICYmIHkgPiBtX3BhdXNlUmVjdC50b3AgJiYgeSA8IG1fcGF1c2VSZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3BhdXNlUmVjdDsKKyAgICBlbHNlIGlmICh4ID4gbV9zdG9wUmVjdC5sZWZ0ICYmIHggPCBtX3N0b3BSZWN0LnJpZ2h0ICYmIHkgPiBtX3N0b3BSZWN0LnRvcCAmJiB5IDwgbV9zdG9wUmVjdC5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9zdG9wUmVjdDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEF1ZGlvUGx1Z2luOjpoYW5kbGVUb3VjaChpbnQgeCwgaW50IHkpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvLyBpZiB0aGUgdHJhY2sgaXMgbnVsbCB0aGVuIHJldHVybgorICAgIGlmIChOVUxMID09IG1fc291bmRQbGF5LT50cmFjaykgeworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSAlcCB1bmFibGUgdG8gY3JlYXRlIHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudFJlY3QgbWF0Y2hlcyB0aGUgYWN0aXZlUmVjdAorICAgIEFOUFJlY3RGKiBjdXJyZW50UmVjdCA9IHZhbGlkVG91Y2goeCx5KTsKKyAgICBpZiAobV9hY3RpdmVUb3VjaFJlY3QgIT0gY3VycmVudFJlY3QpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjdXJyZW50UmVjdCA9PSAmbV9wbGF5UmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHN0YXJ0aW5nIHRyYWNrICglZCkiLAorICAgICAgICAgICAgICAgICAgbV9zb3VuZFBsYXktPnRyYWNrLCBnU291bmRJLmlzU3RvcHBlZChtX3NvdW5kUGxheS0+dHJhY2spKTsKKworICAgICAgICBpZiAoZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdGFydChtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3BhdXNlUmVjdCkgeworCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIHBhdXNpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5wYXVzZShtX3NvdW5kUGxheS0+dHJhY2spOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJlbnRSZWN0ID09ICZtX3N0b3BSZWN0KSB7CisKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgc3RvcHBpbmcgdHJhY2sgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtX3NvdW5kUGxheS0+dHJhY2ssIGdTb3VuZEkuaXNTdG9wcGVkKG1fc291bmRQbGF5LT50cmFjaykpOworCisgICAgICAgIGlmICghZ1NvdW5kSS5pc1N0b3BwZWQobV9zb3VuZFBsYXktPnRyYWNrKSkgeworICAgICAgICAgICAgZ1NvdW5kSS5zdG9wKG1fc291bmRQbGF5LT50cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fc291bmRQbGF5LT5maWxlKSB7CisgICAgICAgICAgICBmc2VlayhtX3NvdW5kUGxheS0+ZmlsZSwgMCwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2V0IHRoZSBjdXJyZW50UmVjdCB0byBiZSB0aGUgYWN0aXZlUmVjdAorICAgIG1fYWN0aXZlUmVjdCA9IGN1cnJlbnRSZWN0OworICAgIGludmFsKGluc3RhbmNlKTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlkMzNhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmbmRlZiBhdWRpb1BsdWdpbl9fREVGSU5FRAorI2RlZmluZSBhdWRpb1BsdWdpbl9fREVGSU5FRAorCitzdHJ1Y3QgU291bmRQbGF5IHsKKyAgICBOUFAgICAgICAgICAgICAgaW5zdGFuY2U7CisgICAgQU5QQXVkaW9UcmFjayogIHRyYWNrOworICAgIEZJTEUqICAgICAgICAgICBmaWxlOworICAgIGludCAgICAgICAgICAgICBmaWxlU2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgcHJvZ3Jlc3M7IC8vIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwCit9OworCitjbGFzcyBBdWRpb1BsdWdpbiA6IHB1YmxpYyBTdWJQbHVnaW4geworcHVibGljOgorICAgIEF1ZGlvUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7Citwcml2YXRlOgorICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKKyAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKKworICAgIHZvaWQgaGFuZGxlVG91Y2goaW50IHgsIGludCB5KTsKKyAgICB2b2lkIGludmFsQWN0aXZlUmVjdCgpOworICAgIEFOUFBhaW50KiBnZXRQYWludChBTlBSZWN0RiopOworICAgIEFOUFJlY3RGKiB2YWxpZFRvdWNoKGludCB4LCBpbnQgeSk7CisKKyAgICBBTlBSZWN0RiAgICBtX3RyYWNrUmVjdDsKKyAgICBBTlBSZWN0RiAgICBtX3BsYXlSZWN0OworICAgIEFOUFJlY3RGICAgIG1fcGF1c2VSZWN0OworICAgIEFOUFJlY3RGICAgIG1fc3RvcFJlY3Q7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2s7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFJlY3Q7CisgICAgQU5QUGFpbnQqICAgbV9wYWludFRleHQ7CisKKyAgICBBTlBQYWludCogICBtX3BhaW50VHJhY2tQcm9ncmVzczsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlUmVjdDsKKworICAgIFNvdW5kUGxheSogIG1fc291bmRQbGF5OworCisgICAgYm9vbCAgICAgICAgbV9hY3RpdmVUb3VjaDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVRvdWNoUmVjdDsKKyAgICBBTlBSZWN0RiogICBtX2FjdGl2ZVJlY3Q7Cit9OworCisjZW5kaWYgLy8gYXVkaW9QbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E3OWVkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QQml0bWFwSW50ZXJmYWNlVjAgICAgZ0JpdG1hcEk7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgZ0xvZ0k7CitleHRlcm4gQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICBnUGF0aEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgZ1R5cGVmYWNlSTsKKworZXh0ZXJuIHVpbnQzMl90IGdldE1TZWNzKCk7CisKKyNkZWZpbmUgQVJSQVlfQ09VTlQoYXJyYXkpICAgICAgKHNpemVvZihhcnJheSkgLyBzaXplb2YoYXJyYXlbMF0pKQorCisvLyNkZWZpbmUgTE9HX0VSUk9SKGluc3QsIHN0cmluZywgcGFyYW1zLi4uKSBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsIChsb2dfcHJlZml4ICsgc3RyaW5nKSwgaW5zdCwgcGFyYW1zKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0JhY2tncm91bmRQbHVnaW46OkJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1fcGFpbnQgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludCwgMHhGRkZGMDAwMCk7CisgICAgZ1BhaW50SS5zZXRUZXh0U2l6ZShtX3BhaW50LCAxNik7CisKKyAgICBBTlBUeXBlZmFjZSogdGYgPSBnVHlwZWZhY2VJLmNyZWF0ZUZyb21OYW1lKCJzZXJpZiIsIGtJdGFsaWNfQU5QVHlwZWZhY2VTdHlsZSk7CisgICAgZ1BhaW50SS5zZXRUeXBlZmFjZShtX3BhaW50LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL2luaXRpYWxpemUgdmFyaWFibGVzCisgICAgbUZpbmlzaGVkU3RhZ2VPbmUgICA9IGZhbHNlOworICAgIG1GaW5pc2hlZFN0YWdlVHdvICAgPSBmYWxzZTsKKyAgICBtRmluaXNoZWRTdGFnZVRocmVlID0gZmFsc2U7CisKKyAgICAvLyB0ZXN0IGJhc2ljIHBsdWdpbiBmdW5jdGlvbmFsaXR5CisgICAgdGVzdF9sb2dnaW5nKCk7IC8vIGFuZHJvaWQgbG9nZ2luZworICAgIHRlc3RfdGltZXJzKCk7ICAvLyBwbHVnaW4gdGltZXJzCisgICAgdGVzdF9iaXRtYXBzKCk7IC8vIGFuZHJvaWQgYml0bWFwcworICAgIHRlc3RfZG9tQWNjZXNzKCk7CisgICAgdGVzdF9qYXZhc2NyaXB0KCk7Cit9CisKK0JhY2tncm91bmRQbHVnaW46On5CYWNrZ3JvdW5kUGx1Z2luKCkgeworfQorCitib29sIEJhY2tncm91bmRQbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpOworfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OmRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7CisKKyAgICBBTlBSZWN0RiBjbGlwUjsKKyAgICBjbGlwUi5sZWZ0ID0gY2xpcC5sZWZ0OworICAgIGNsaXBSLnRvcCA9IGNsaXAudG9wOworICAgIGNsaXBSLnJpZ2h0ID0gY2xpcC5yaWdodDsKKyAgICBjbGlwUi5ib3R0b20gPSBjbGlwLmJvdHRvbTsKKyAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisKKyAgICBkcmF3KGNhbnZhcyk7CisgICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Cit9CisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6ZHJhdyhBTlBDYW52YXMqIGNhbnZhcykgeworCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgMHhGRkZGRkZGRik7CisKKyAgICBBTlBGb250TWV0cmljcyBmbTsKKyAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnQsICZmbSk7CisKKyAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkYwMDAwRkYpOworICAgIGNvbnN0IGNoYXIgY1tdID0gIlRoaXMgaXMgYSBiYWNrZ3JvdW5kIHBsdWdpbi4iOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgYywgc2l6ZW9mKGMpLTEsIDEwLCAtZm0uZlRvcCwgbV9wYWludCk7Cit9CisKK2ludDE2IEJhY2tncm91bmRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgc3dpdGNoIChldnQtPmRhdGEuZHJhdy5tb2RlbCkgeworICAgICAgICAgICAgICAgIGNhc2Uga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWw6CisgICAgICAgICAgICAgICAgICAgIHRlc3RfYml0bWFwX3RyYW5zcGFyZW5jeShldnQpOworICAgICAgICAgICAgICAgICAgICBkcmF3UGx1Z2luKGV2dC0+ZGF0YS5kcmF3LmRhdGEuYml0bWFwLCBldnQtPmRhdGEuZHJhdy5jbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCisgICAgICAgICAgICB9CisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHRoZSBwbHVnaW4gZGlkIG5vdCByZXF1ZXN0IHRvdWNoIGV2ZW50cyIsIGluc3RhbmNlKTsKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIHRoZSBwbHVnaW4gZGlkIG5vdCByZXF1ZXN0IGtleSBldmVudHMiLCBpbnN0YW5jZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gTE9HR0lORyBURVNUUworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF9sb2dnaW5nKCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIC8vTE9HX0VSUk9SKGluc3RhbmNlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBFcnJvciIsIGluc3RhbmNlKTsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIExvZyBFcnJvciIsIGluc3RhbmNlKTsKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtXYXJuaW5nX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIFRlc3RpbmcgTG9nIFdhcm5pbmciLCBpbnN0YW5jZSk7CisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBMb2cgRGVidWciLCBpbnN0YW5jZSk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRJTUVSIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgVElNRVJfSU5URVJWQUwgICAgIDUwCitzdGF0aWMgdm9pZCB0aW1lcl9vbmVzaG90KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfbmV2ZXJmaXJlcyhOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKK3N0YXRpYyB2b2lkIHRpbWVyX2xhdGVuY3koTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCk7CisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF90aW1lcnMoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy9TZXR1cCB0aGUgdGVzdGluZyBjb3VudGVycworICAgIG1UaW1lclJlcGVhdENvdW50ID0gNTsKKyAgICBtVGltZXJMYXRlbmN5Q291bnQgPSA1OworCisgICAgLy8gdGVzdCBmb3IgYm9ndXMgdGltZXJJRAorICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgOTk5OTk5KTsKKyAgICAvLyB0ZXN0IG9uZS1zaG90CisgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfb25lc2hvdCk7CisgICAgLy8gdGVzdCByZXBlYXQKKyAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCA1MCwgdHJ1ZSwgdGltZXJfcmVwZWF0KTsKKyAgICAvLyB0ZXN0IHRpbWVyIGxhdGVuY3kKKyAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBUSU1FUl9JTlRFUlZBTCwgdHJ1ZSwgdGltZXJfbGF0ZW5jeSk7CisgICAgbVN0YXJ0VGltZSA9IG1QcmV2VGltZSA9IGdldE1TZWNzKCk7CisgICAgLy8gdGVzdCB1bnNjaGVkdWxlIGltbWVkaWF0ZWx5CisgICAgdWludDMyIGlkID0gYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfbmV2ZXJmaXJlcyk7CisgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7CisgICAgLy8gdGVzdCBkb3VibGUgdW5zY2hlZHVsZSAoc2hvdWxkIGJlIG5vLW9wKQorICAgIGJyb3dzZXItPnVuc2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgaWQpOworCit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX29uZXNob3QoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tLS0tLSBvbmVzaG90IHRpbWVyXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKKyAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tLS0gcmVwZWF0IHRpbWVyICVkXG4iLAorICAgICAgICAgICAgICBvYmotPm1UaW1lclJlcGVhdENvdW50KTsKKyAgICBpZiAoLS1vYmotPm1UaW1lclJlcGVhdENvdW50ID09IDApIHsKKyAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCB0aW1lcklEKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0tLSB0aW1lcl9uZXZlcmZpcmVzISEhXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7CisgICAgQmFja2dyb3VuZFBsdWdpbiAqb2JqID0gKChCYWNrZ3JvdW5kUGx1Z2luKikgKChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGEpLT5hY3RpdmVQbHVnaW4pOworCisgICAgb2JqLT5tVGltZXJMYXRlbmN5Q3VycmVudENvdW50ICs9IDE7CisKKyAgICB1aW50MzJfdCBub3cgPSBnZXRNU2VjcygpOworICAgIHVpbnQzMl90IGludGVydmFsID0gbm93IC0gb2JqLT5tUHJldlRpbWU7CisgICAgdWludDMyX3QgZHVyID0gbm93IC0gb2JqLT5tU3RhcnRUaW1lOworICAgIHVpbnQzMl90IGV4cGVjdGVkRHVyID0gb2JqLT5tVGltZXJMYXRlbmN5Q3VycmVudENvdW50ICogVElNRVJfSU5URVJWQUw7CisgICAgaW50MzJfdCBkcmlmdCA9IGR1ciAtIGV4cGVjdGVkRHVyOworICAgIGludDMyX3QgYXZnRHJpZnQgPSBkcmlmdCAvIG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudDsKKworICAgIG9iai0+bVByZXZUaW1lID0gbm93OworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKKyAgICAgICAgICAgICAgIi0tLS0tLS0tIGxhdGVuY3kgdGVzdDogWyUzZF0gaW50ZXJ2YWwgJWQgZXhwZWN0ZWQgJWQsIHRvdGFsICVkIGV4cGVjdGVkICVkLCBkcmlmdCAlZCBhdmcgJWRcbiIsCisgICAgICAgICAgICAgIG9iai0+bVRpbWVyTGF0ZW5jeUN1cnJlbnRDb3VudCwgaW50ZXJ2YWwsIFRJTUVSX0lOVEVSVkFMLCBkdXIsCisgICAgICAgICAgICAgIGV4cGVjdGVkRHVyLCBkcmlmdCwgYXZnRHJpZnQpOworCisgICAgaWYgKC0tb2JqLT5tVGltZXJMYXRlbmN5Q291bnQgPT0gMCkgeworICAgICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIHRpbWVySUQpOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQklUTUFQIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyB2b2lkIHRlc3RfZm9ybWF0cyhOUFAgaW5zdGFuY2UpOworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfYml0bWFwcygpIHsKKyAgICB0ZXN0X2Zvcm1hdHModGhpcy0+aW5zdCgpKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9mb3JtYXRzKE5QUCBpbnN0YW5jZSkgeworCisgICAgLy8gVE9ETyBwdWxsIG5hbWVzIGZyb20gZW51bSBpbiBucGFwaSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgdGhlbQorICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBBTlBCaXRtYXBGb3JtYXQgZkZvcm1hdDsKKyAgICAgICAgY29uc3QgY2hhciogICAgIGZOYW1lOworICAgIH0gZ1JlY3NbXSA9IHsKKyAgICAgICAgeyBrVW5rbm93bl9BTlBCaXRtYXBGb3JtYXQsICAgInVua25vd24iIH0sCisgICAgICAgIHsga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQsICI4ODg4IiB9LAorICAgICAgICB7IGtSR0JfNTY1X0FOUEJpdG1hcEZvcm1hdCwgICAiNTY1IiB9LAorICAgIH07CisKKyAgICBBTlBQaXhlbFBhY2tpbmcgcGFja2luZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX0NPVU5UKGdSZWNzKTsgaSsrKSB7CisgICAgICAgIGlmIChnQml0bWFwSS5nZXRQaXhlbFBhY2tpbmcoZ1JlY3NbaV0uZkZvcm1hdCwgJnBhY2tpbmcpKSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICJwaXhlbCBmb3JtYXQgWyVkXSAlcyBoYXMgcGFja2luZyBBUkdCIFslZCAlZF0gWyVkICVkXSBbJWQgJWRdIFslZCAlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ1JlY3NbaV0uZkZvcm1hdCwgZ1JlY3NbaV0uZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5BU2hpZnQsIHBhY2tpbmcuQUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5SU2hpZnQsIHBhY2tpbmcuUkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5HU2hpZnQsIHBhY2tpbmcuR0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgcGFja2luZy5CU2hpZnQsIHBhY2tpbmcuQkJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0IFslZF0gJXMgaGFzIG5vIHBhY2tpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ1JlY3NbaV0uZkZvcm1hdCwgZ1JlY3NbaV0uZk5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfYml0bWFwX3RyYW5zcGFyZW5jeShjb25zdCBBTlBFdmVudCogZXZ0KSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgLy8gY2hlY2sgZGVmYXVsdCAmIHNldCB0cmFuc3BhcmVudAorICAgIGlmICghbUZpbmlzaGVkU3RhZ2VPbmUpIHsKKworICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiQkVHSU46IHRlc3RpbmcgYml0bWFwIHRyYW5zcGFyZW5jeSIpOworCisgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIG5vdCB0cmFuc3BhcmVudAorICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0ID09IGtSR0JBXzg4ODhfQU5QQml0bWFwRm9ybWF0KSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiYml0bWFwIGRlZmF1bHQgZm9ybWF0IGlzIHRyYW5zcGFyZW50Iik7CisgICAgICAgIH0KKworICAgICAgICAvL21ha2UgaXQgdHJhbnNwYXJlbnQgKGFueSBub24tbnVsbCB2YWx1ZSB3aWxsIHNldCBpdCB0byB0cnVlKQorICAgICAgICBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICAgICAgTlBFcnJvciBlcnIgPSBicm93c2VyLT5zZXR2YWx1ZShpbnN0YW5jZSwgTlBQVnBsdWdpblRyYW5zcGFyZW50Qm9vbCwgJnZhbHVlKTsKKyAgICAgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNldHRpbmcgdHJhbnNwYXJlbmN5LiIpOworICAgICAgICB9CisKKyAgICAgICAgbUZpbmlzaGVkU3RhZ2VPbmUgPSB0cnVlOworICAgICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CisgICAgfQorICAgIC8vIGNoZWNrIHRyYW5zcGFyZW50ICYgc2V0IG9wYXF1ZQorICAgIGVsc2UgaWYgKCFtRmluaXNoZWRTdGFnZVR3bykgeworCisgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIHRyYW5zcGFyZW50CisgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgIT0ga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJiaXRtYXAgZGlkIG5vdCBjaGFuZ2UgdG8gdHJhbnNwYXJlbnQgZm9ybWF0Iik7CisgICAgICAgIH0KKworICAgICAgICAvL21ha2UgaXQgb3BhcXVlCisgICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdGFuY2UsIE5QUFZwbHVnaW5UcmFuc3BhcmVudEJvb2wsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtFcnJvcl9BTlBMb2dUeXBlLCAiRXJyb3Igc2V0dGluZyB0cmFuc3BhcmVuY3kuIik7CisgICAgICAgIH0KKworICAgICAgICBtRmluaXNoZWRTdGFnZVR3byA9IHRydWU7CisgICAgfQorICAgIC8vIGNoZWNrIG9wYXF1ZQorICAgIGVsc2UgaWYgKCFtRmluaXNoZWRTdGFnZVRocmVlKSB7CisKKyAgICAgICAgLy9jaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgbm90IHRyYW5zcGFyZW50CisgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgPT0ga1JHQkFfODg4OF9BTlBCaXRtYXBGb3JtYXQpIHsKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJiaXRtYXAgZGVmYXVsdCBmb3JtYXQgaXMgdHJhbnNwYXJlbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJFTkQ6IHRlc3RpbmcgYml0bWFwIHRyYW5zcGFyZW5jeSIpOworCisgICAgICAgIG1GaW5pc2hlZFN0YWdlVGhyZWUgPSB0cnVlOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRE9NIFRFU1RTCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF9kb21BY2Nlc3MoKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVGVzdGluZyBET00gQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIHJldHJpZXZlIERPTSBXaW5kb3ciLCBpbnN0YW5jZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhIHByb3BlcnR5IGZyb20gdGhlIHBsdWdpbidzIERPTSBvYmplY3QKKyAgICBOUElkZW50aWZpZXIgdG9wSWRlbnRpZmllciA9IGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXIoInRvcCIpOworICAgIE5QVmFyaWFudCB0b3BPYmplY3RWYXJpYW50OworICAgIGJyb3dzZXItPmdldHByb3BlcnR5KGluc3RhbmNlLCB3aW5kb3dPYmplY3QsIHRvcElkZW50aWZpZXIsICZ0b3BPYmplY3RWYXJpYW50KTsKKworICAgIGlmICh0b3BPYmplY3RWYXJpYW50LnR5cGUgIT0gTlBWYXJpYW50VHlwZV9PYmplY3QpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIEludmFsaWQgVmFyaWFudCB0eXBlIGZvciBET00gUHJvcGVydHk6ICVkLCVkIiwgaW5zdGFuY2UsIHRvcE9iamVjdFZhcmlhbnQudHlwZSwgTlBWYXJpYW50VHlwZV9PYmplY3QpOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEpBVkFTQ1JJUFQgVEVTVFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCit2b2lkIEJhY2tncm91bmRQbHVnaW46OnRlc3RfamF2YXNjcmlwdCgpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCBUZXN0aW5nIEphdmFTY3JpcHQgQWNjZXNzIiwgaW5zdGFuY2UpOworCisgICAgLy8gR2V0IHRoZSBwbHVnaW4ncyBET00gb2JqZWN0CisgICAgTlBPYmplY3QqIHdpbmRvd09iamVjdCA9IE5VTEw7CisgICAgYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIE5QTlZXaW5kb3dOUE9iamVjdCwgJndpbmRvd09iamVjdCk7CisKKyAgICBpZiAoIXdpbmRvd09iamVjdCkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIHJldHJpZXZlIERPTSBXaW5kb3ciLCBpbnN0YW5jZSk7CisKKyAgICAvLyBjcmVhdGUgYSBzdHJpbmcgKEpTIGNvZGUpIHRoYXQgaXMgc3RvcmVkIGluIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGJyb3dzZXIKKyAgICBjb25zdCBjaGFyKiBqc1N0cmluZyA9ICIxMjAwICsgMzQiOworICAgIHZvaWQqIHN0cmluZ01lbSA9IGJyb3dzZXItPm1lbWFsbG9jKHN0cmxlbihqc1N0cmluZykpOworICAgIG1lbWNweShzdHJpbmdNZW0sIGpzU3RyaW5nLCBzdHJsZW4oanNTdHJpbmcpKTsKKworICAgIC8vIGV4ZWN1dGUgdGhlIGphdmFzY3JpcHQgaW4gdGhlIHBsdWdpbidzIERPTSBvYmplY3QKKyAgICBOUFN0cmluZyBzY3JpcHQgPSB7IChjaGFyKilzdHJpbmdNZW0sIHN0cmxlbihqc1N0cmluZykgfTsKKyAgICBOUFZhcmlhbnQgc2NyaXB0VmFyaWFudDsKKyAgICBpZiAoIWJyb3dzZXItPmV2YWx1YXRlKGluc3RhbmNlLCB3aW5kb3dPYmplY3QsICZzY3JpcHQsICZzY3JpcHRWYXJpYW50KSkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgVW5hYmxlIHRvIGV2YWwgdGhlIEpTLiIsIGluc3RhbmNlKTsKKworICAgIGlmIChzY3JpcHRWYXJpYW50LnR5cGUgPT0gTlBWYXJpYW50VHlwZV9JbnQzMikgeworICAgICAgICBpZiAoc2NyaXB0VmFyaWFudC52YWx1ZS5pbnRWYWx1ZSAhPSAxMjM0KQorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIiAtLS0tLS0gJXAgSW52YWxpZCBWYWx1ZSBmb3IgSlMgUmV0dXJuOiAlZCwxMjM0IiwgaW5zdGFuY2UsIHNjcmlwdFZhcmlhbnQudmFsdWUuaW50VmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICIgLS0tLS0tICVwIEludmFsaWQgVmFyaWFudCB0eXBlIGZvciBKUyBSZXR1cm46ICVkLCVkIiwgaW5zdGFuY2UsIHNjcmlwdFZhcmlhbnQudHlwZSwgTlBWYXJpYW50VHlwZV9JbnQzMik7CisgICAgfQorCisgICAgLy8gZnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCB3aXRoaW4gdGhlIGJyb3dzZXIKKyAgICBicm93c2VyLT5tZW1mcmVlKHN0cmluZ01lbSk7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDczODliCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIGJhY2tncm91bmRQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgYmFja2dyb3VuZFBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBCYWNrZ3JvdW5kUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgQmFja2dyb3VuZFBsdWdpbihOUFAgaW5zdCk7CisgICAgdmlydHVhbCB+QmFja2dyb3VuZFBsdWdpbigpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOworICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisKKyAgICAvLyBUaW1lciBUZXN0aW5nIFZhcmlhYmxlcworICAgIHVpbnQzMl90IG1TdGFydFRpbWU7CisgICAgdWludDMyX3QgbVByZXZUaW1lOworICAgIGludCAgICAgIG1UaW1lclJlcGVhdENvdW50OworICAgIGludCAgICAgIG1UaW1lckxhdGVuY3lDb3VudDsKKyAgICBpbnQgICAgICBtVGltZXJMYXRlbmN5Q3VycmVudENvdW50OworCisgICAgLy8gQml0bWFwIFRyYW5zcGFyZW5jeSBWYXJpYWJsZXMKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlT25lOyAgIC8vIGNoZWNrIGRlZmF1bHQgJiBzZXQgdHJhbnNwYXJlbnQKKyAgICBib29sIG1GaW5pc2hlZFN0YWdlVHdvOyAgIC8vIGNoZWNrIHRyYW5zcGFyZW50ICYgc2V0IG9wYXF1ZQorICAgIGJvb2wgbUZpbmlzaGVkU3RhZ2VUaHJlZTsgLy8gY2hlY2sgb3BhcXVlCisKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgQU5QUGFpbnQqICAgbV9wYWludDsKKworICAgIHZvaWQgdGVzdF9sb2dnaW5nKCk7CisgICAgdm9pZCB0ZXN0X3RpbWVycygpOworICAgIHZvaWQgdGVzdF9iaXRtYXBzKCk7CisgICAgdm9pZCB0ZXN0X2JpdG1hcF90cmFuc3BhcmVuY3koY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdm9pZCB0ZXN0X2RvbUFjY2VzcygpOworICAgIHZvaWQgdGVzdF9qYXZhc2NyaXB0KCk7CisKK307CisKKyNlbmRpZiAvLyBiYWNrZ3JvdW5kUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5NTUwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZXh0ZXJuIE5QTmV0c2NhcGVGdW5jcyogICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgICBnTG9nSTsKK2V4dGVybiBBTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgZ0NhbnZhc0k7CitleHRlcm4gQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgIGdQYWludEk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgIGdXaW5kb3dJOworCisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSkgeworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKKyAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OworICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgaXggPSAwOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgeworICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7CisKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBOUFJlY3QgaW52YWw7CisgICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOworICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7CisgICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOworICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOworICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Zvcm1QbHVnaW46OkZvcm1QbHVnaW4oTlBQIGluc3QpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1faGFzRm9jdXMgPSBmYWxzZTsKKyAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKworICAgIG1lbXNldCgmbV91c2VybmFtZUlucHV0LCAwLCBzaXplb2YobV91c2VybmFtZUlucHV0KSk7CisgICAgbWVtc2V0KCZtX3Bhc3N3b3JkSW5wdXQsIDAsIHNpemVvZihtX3Bhc3N3b3JkSW5wdXQpKTsKKworICAgIG1fdXNlcm5hbWVJbnB1dC50ZXh0WzBdID0gJ1wwJzsKKyAgICBtX3VzZXJuYW1lSW5wdXQuY2hhclB0ciA9IDA7CisKKyAgICBtX3Bhc3N3b3JkSW5wdXQudGV4dFswXSA9ICdcMCc7CisgICAgbV9wYXNzd29yZElucHV0LmNoYXJQdHIgPSAwOworCisgICAgbV9wYWludElucHV0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludElucHV0LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRJbnB1dCkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50SW5wdXQsIDB4RkZGRkZGRkYpOworCisgICAgbV9wYWludEFjdGl2ZSA9IGdQYWludEkubmV3UGFpbnQoKTsKKyAgICBnUGFpbnRJLnNldEZsYWdzKG1fcGFpbnRBY3RpdmUsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludEFjdGl2ZSkgfCBrQW50aUFsaWFzX0FOUFBhaW50RmxhZyk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50QWN0aXZlLCAweEZGRkZGRjAwKTsKKworICAgIG1fcGFpbnRUZXh0ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFRleHQsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFRleHQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFRleHQsIDB4RkYwMDAwMDApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludFRleHQsIDE4KTsKKworICAgIEFOUFR5cGVmYWNlKiB0ZiA9IGdUeXBlZmFjZUkuY3JlYXRlRnJvbU5hbWUoInNlcmlmIiwga0l0YWxpY19BTlBUeXBlZmFjZVN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFR5cGVmYWNlKG1fcGFpbnRUZXh0LCB0Zik7CisgICAgZ1R5cGVmYWNlSS51bnJlZih0Zik7CisKKyAgICAvL3JlZ2lzdGVyIGZvciBrZXkgYW5kIHZpc2libGVSZWN0IGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrS2V5X0FOUEV2ZW50RmxhZzsKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3QsIGtBY2NlcHRFdmVudHNfQU5QU2V0VmFsdWUsICZmbGFncyk7CisgICAgaWYgKGVyciAhPSBOUEVSUl9OT19FUlJPUikgeworICAgICAgICBnTG9nSS5sb2coaW5zdCwga0Vycm9yX0FOUExvZ1R5cGUsICJFcnJvciBzZWxlY3RpbmcgaW5wdXQgZXZlbnRzLiIpOworICAgIH0KK30KKworRm9ybVBsdWdpbjo6fkZvcm1QbHVnaW4oKSB7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50SW5wdXQpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludEFjdGl2ZSk7CisgICAgZ1BhaW50SS5kZWxldGVQYWludChtX3BhaW50VGV4dCk7Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6c3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsIG1vZGVsKSB7CisgICAgcmV0dXJuIChtb2RlbCA9PSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6ZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApIHsKKyAgICBBTlBDYW52YXMqIGNhbnZhcyA9IGdDYW52YXNJLm5ld0NhbnZhcygmYml0bWFwKTsKKworICAgIEFOUFJlY3RGIGNsaXBSOworICAgIGNsaXBSLmxlZnQgPSBjbGlwLmxlZnQ7CisgICAgY2xpcFIudG9wID0gY2xpcC50b3A7CisgICAgY2xpcFIucmlnaHQgPSBjbGlwLnJpZ2h0OworICAgIGNsaXBSLmJvdHRvbSA9IGNsaXAuYm90dG9tOworICAgIGdDYW52YXNJLmNsaXBSZWN0KGNhbnZhcywgJmNsaXBSKTsKKworICAgIGRyYXcoY2FudmFzKTsKKyAgICBnQ2FudmFzSS5kZWxldGVDYW52YXMoY2FudmFzKTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3KEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIGNvbnN0IGZsb2F0IGlucHV0V2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEhlaWdodCA9IDMwOworICAgIGNvbnN0IGludCBXID0gb2JqLT53aW5kb3ctPndpZHRoOworICAgIGNvbnN0IGludCBIID0gb2JqLT53aW5kb3ctPmhlaWdodDsKKworICAgIC8vIGNvbG9yIHRoZSBwbHVnaW4gY2FudmFzCisgICAgZ0NhbnZhc0kuZHJhd0NvbG9yKGNhbnZhcywgKG1faGFzRm9jdXMpID8gMHhGRkNEQ0RDRCA6IDB4RkY1NDU0NTQpOworCisgICAgLy8gZHJhdyB0aGUgdXNlcm5hbWUgYm94ICg1IHB4IGZyb20gdGhlIHRvcCBlZGdlKQorICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LmxlZnQgPSA1OworICAgIG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCA9IDU7CisgICAgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3VzZXJuYW1lSW5wdXQucmVjdC5ib3R0b20gPSBtX3VzZXJuYW1lSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3VzZXJuYW1lSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fdXNlcm5hbWVJbnB1dCkpOworICAgIGRyYXdUZXh0KGNhbnZhcywgbV91c2VybmFtZUlucHV0KTsKKworICAgIC8vIGRyYXcgdGhlIHBhc3N3b3JkIGJveCAoNSBweCBmcm9tIHRoZSBib3R0b20gZWRnZSkKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ID0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgPSBIIC0gKGlucHV0SGVpZ2h0ICsgNSk7CisgICAgbV9wYXNzd29yZElucHV0LnJlY3QucmlnaHQgPSBXIC0gNTsKKyAgICBtX3Bhc3N3b3JkSW5wdXQucmVjdC5ib3R0b20gPSBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgKyBpbnB1dEhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX3Bhc3N3b3JkSW5wdXQucmVjdCwgZ2V0UGFpbnQoJm1fcGFzc3dvcmRJbnB1dCkpOworICAgIGRyYXdQYXNzd29yZChjYW52YXMsIG1fcGFzc3dvcmRJbnB1dCk7CisKKyAgICAvL2ludmFsaWRhdGUgdGhlIGNhbnZhcworICAgIC8vaW52YWwoaW5zdGFuY2UpOworfQorCitBTlBQYWludCogRm9ybVBsdWdpbjo6Z2V0UGFpbnQoVGV4dElucHV0KiBpbnB1dCkgeworICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVJbnB1dCkgPyBtX3BhaW50QWN0aXZlIDogbV9wYWludElucHV0OworfQorCit2b2lkIEZvcm1QbHVnaW46OmRyYXdUZXh0KEFOUENhbnZhcyogY2FudmFzLCBUZXh0SW5wdXQgdGV4dElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgdGV4dElucHV0LnRleHQsIHRleHRJbnB1dC5jaGFyUHRyLAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIHRleHRJbnB1dC5yZWN0LmJvdHRvbSAtIGZvbnRNZXRyaWNzLmZCb3R0b20sIG1fcGFpbnRUZXh0KTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpkcmF3UGFzc3dvcmQoQU5QQ2FudmFzKiBjYW52YXMsIFRleHRJbnB1dCBwYXNzd29yZElucHV0KSB7CisKKyAgICAvLyBnZXQgZm9udCBtZXRyaWNzCisgICAgQU5QRm9udE1ldHJpY3MgZm9udE1ldHJpY3M7CisgICAgZ1BhaW50SS5nZXRGb250TWV0cmljcyhtX3BhaW50VGV4dCwgJmZvbnRNZXRyaWNzKTsKKworICAgIC8vIGNvbXB1dCB0aGUgY2lyY2xlIGRpbWVuc2lvbnMgYW5kIGluaXRpYWwgbG9jYXRpb24KKyAgICBmbG9hdCBpbml0aWFsWCA9IHBhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICsgNTsKKyAgICBmbG9hdCBvdmFsQm90dG9tID0gcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSAtIDI7CisgICAgZmxvYXQgb3ZhbFRvcCA9IG92YWxCb3R0b20gLSAoZm9udE1ldHJpY3MuZkJvdHRvbSAtIGZvbnRNZXRyaWNzLmZUb3ApOworICAgIGZsb2F0IG92YWxXaWR0aCA9IG92YWxCb3R0b20gLSBvdmFsVG9wOworICAgIGZsb2F0IG92YWxTcGFjaW5nID0gMzsKKworICAgIC8vIGRyYXcgY2lyY2xlcyBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwgdGV4dAorICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBwYXNzd29yZElucHV0LmNoYXJQdHI7IHgrKykgeworICAgICAgICBBTlBSZWN0RiBvdmFsOworICAgICAgICBvdmFsLmxlZnQgPSBpbml0aWFsWCArICgob3ZhbFdpZHRoICsgb3ZhbFNwYWNpbmcpICogKGZsb2F0KSB4KTsKKyAgICAgICAgb3ZhbC5yaWdodCA9IG92YWwubGVmdCArIG92YWxXaWR0aDsKKyAgICAgICAgb3ZhbC50b3AgPSBvdmFsVG9wOworICAgICAgICBvdmFsLmJvdHRvbSA9IG92YWxCb3R0b207CisgICAgICAgIGdDYW52YXNJLmRyYXdPdmFsKGNhbnZhcywgJm92YWwsIG1fcGFpbnRUZXh0KTsKKyAgICB9Cit9CisKK2ludDE2IEZvcm1QbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgc3dpdGNoIChldnQtPmRhdGEuZHJhdy5tb2RlbCkgeworICAgICAgICAgICAgICAgIGNhc2Uga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWw6CisgICAgICAgICAgICAgICAgICAgIGRyYXdQbHVnaW4oZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAsIGV2dC0+ZGF0YS5kcmF3LmNsaXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvLyB1bmtub3duIGRyYXdpbmcgbW9kZWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0xpZmVjeWNsZV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24gPT0ga0xvc2VGb2N1c19BTlBMaWZlY3ljbGVBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIExvb3NpbmcgRm9jdXMiLCBpbnN0YW5jZSk7CisKKyAgICAgICAgICAgICAgICBpZiAobV9hY3RpdmVJbnB1dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBrZXlib2FyZAorICAgICAgICAgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSBhY3RpdmVJbnB1dAorICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZUlucHV0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtX2hhc0ZvY3VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24gPT0ga0dhaW5Gb2N1c19BTlBMaWZlY3ljbGVBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIEdhaW5pbmcgRm9jdXMiLCBpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgbV9oYXNGb2N1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgaW52YWwoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOiB7CisKKyAgICAgICAgICAgIGludCB4ID0gZXZ0LT5kYXRhLm1vdXNlLng7CisgICAgICAgICAgICBpbnQgeSA9IGV2dC0+ZGF0YS5tb3VzZS55OworICAgICAgICAgICAgaWYgKGtEb3duX0FOUE1vdXNlQWN0aW9uID09IGV2dC0+ZGF0YS5tb3VzZS5hY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIFRleHRJbnB1dCogY3VycmVudElucHV0ID0gdmFsaWRUYXAoeCx5KTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGdXaW5kb3dJLnNob3dLZXlib2FyZChpbnN0YW5jZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV9hY3RpdmVJbnB1dCkKKyAgICAgICAgICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudElucHV0ICE9IG1fYWN0aXZlSW5wdXQpCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaEFjdGl2ZUlucHV0KGN1cnJlbnRJbnB1dCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5LmFjdGlvbiA9PSBrRG93bl9BTlBLZXlBY3Rpb24pIHsKKworICAgICAgICAgICAgICAgIC8vaGFuZGxlIG5hdmlnYXRpb24ga2V5cworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPj0ga0RwYWRVcF9BTlBLZXlDb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUgPD0ga0RwYWRDZW50ZXJfQU5QS2V5Q29kZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlTmF2aWdhdGlvbihldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dElucHV0KG1fYWN0aXZlSW5wdXQsIGV2dC0+ZGF0YS5rZXkubmF0aXZlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudW5pY2hhcik7CisgICAgICAgICAgICAgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c3dpdGNoQWN0aXZlSW5wdXQoVGV4dElucHV0KiBuZXdJbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG9sZAorICAgICAgICBnV2luZG93SS5jbGVhclZpc2libGVSZWN0cyhpbnN0YW5jZSk7CisgICAgfQorCisgICAgbV9hY3RpdmVJbnB1dCA9IG5ld0lucHV0OyAvLyBzZXQgdGhlIG5ldyBhY3RpdmUgaW5wdXQKKworICAgIGlmIChtX2FjdGl2ZUlucHV0KSB7CisgICAgICAgIGludmFsKGluc3RhbmNlLCBtX2FjdGl2ZUlucHV0LT5yZWN0LCB0cnVlKTsgLy8gaW52YWwgdGhlIG5ldworICAgICAgICBzY3JvbGxJbnRvVmlldyhtX2FjdGl2ZUlucHV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRm9ybVBsdWdpbjo6aGFuZGxlTmF2aWdhdGlvbihBTlBLZXlDb2RlIGtleUNvZGUpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSVwIFJlY3ZkIE5hdiBLZXkgJWQiLCBpbnN0YW5jZSwga2V5Q29kZSk7CisKKyAgICBpZiAoIW1fYWN0aXZlSW5wdXQpIHsKKyAgICAgICAgc3dpdGNoQWN0aXZlSW5wdXQoJm1fdXNlcm5hbWVJbnB1dCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1fYWN0aXZlSW5wdXQgPT0gJm1fdXNlcm5hbWVJbnB1dCkgeworICAgICAgICBpZiAoa2V5Q29kZSA9PSBrRHBhZERvd25fQU5QS2V5Q29kZSkgeworICAgICAgICAgICAgc3dpdGNoQWN0aXZlSW5wdXQoJm1fcGFzc3dvcmRJbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZENlbnRlcl9BTlBLZXlDb2RlKQorICAgICAgICAgICAgZ1dpbmRvd0kuc2hvd0tleWJvYXJkKGluc3RhbmNlLCBmYWxzZSk7CisgICAgICAgIGVsc2UgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmIChtX2FjdGl2ZUlucHV0ID09ICZtX3Bhc3N3b3JkSW5wdXQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0ga0RwYWRVcF9BTlBLZXlDb2RlKSB7CisgICAgICAgICAgICBzd2l0Y2hBY3RpdmVJbnB1dCgmbV91c2VybmFtZUlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChrZXlDb2RlID09IGtEcGFkQ2VudGVyX0FOUEtleUNvZGUpCisgICAgICAgICAgICBnV2luZG93SS5zaG93S2V5Ym9hcmQoaW5zdGFuY2UsIGZhbHNlKTsKKyAgICAgICAgZWxzZSBpZiAoa2V5Q29kZSA9PSBrRHBhZERvd25fQU5QS2V5Q29kZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBGb3JtUGx1Z2luOjpoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisKKyAgICAvL21ha2Ugc3VyZSB0aGUgaW5wdXQgZmllbGQgaXMgaW4gdmlldworICAgIHNjcm9sbEludG9WaWV3KGlucHV0KTsKKworICAgIC8vaGFuZGxlIHRoZSBkZWxldGUgb3BlcmF0aW9uCisgICAgaWYgKGtleUNvZGUgPT0ga0RlbF9BTlBLZXlDb2RlKSB7CisgICAgICAgIGlmIChpbnB1dC0+Y2hhclB0ciA+IDApIHsKKyAgICAgICAgICAgIGlucHV0LT5jaGFyUHRyLS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vY2hlY2sgdG8gc2VlIHRoYXQgdGhlIGlucHV0IGlzIG5vdCBmdWxsCisgICAgaWYgKGlucHV0LT5jaGFyUHRyID49IChzaXplb2YoaW5wdXQtPnRleHQpIC0gMSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vYWRkIHRoZSBjaGFyYWN0ZXIKKyAgICBpbnB1dC0+dGV4dFtpbnB1dC0+Y2hhclB0cl0gPSBzdGF0aWNfY2FzdDxjaGFyPih1bmljaGFyKTsKKyAgICBpbnB1dC0+Y2hhclB0cisrOworCisgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0lcCBUZXh0OiAgJWMiLCBpbnN0YW5jZSwgdW5pY2hhcik7Cit9CisKK3ZvaWQgRm9ybVBsdWdpbjo6c2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgTlBXaW5kb3cgKndpbmRvdyA9IG9iai0+d2luZG93OworCisgICAgLy8gZmluZCB0aGUgdGV4dElucHV0J3MgZ2xvYmFsIHJlY3QgY29vcmRpbmF0ZXMKKyAgICBBTlBSZWN0SSB2aXNpYmxlUmVjdHNbMV07CisgICAgdmlzaWJsZVJlY3RzWzBdLmxlZnQgPSBpbnB1dC0+cmVjdC5sZWZ0OworICAgIHZpc2libGVSZWN0c1swXS50b3AgPSBpbnB1dC0+cmVjdC50b3A7CisgICAgdmlzaWJsZVJlY3RzWzBdLnJpZ2h0ID0gaW5wdXQtPnJlY3QucmlnaHQ7CisgICAgdmlzaWJsZVJlY3RzWzBdLmJvdHRvbSA9IGlucHV0LT5yZWN0LmJvdHRvbTsKKworICAgIGdXaW5kb3dJLnNldFZpc2libGVSZWN0cyhpbnN0YW5jZSwgdmlzaWJsZVJlY3RzLCAxKTsKK30KKworVGV4dElucHV0KiBGb3JtUGx1Z2luOjp2YWxpZFRhcChpbnQgeCwgaW50IHkpIHsKKworICAgIGlmICh4ID4gbV91c2VybmFtZUlucHV0LnJlY3QubGVmdCAmJiB4IDwgbV91c2VybmFtZUlucHV0LnJlY3QucmlnaHQgJiYKKyAgICAgICAgeSA+IG1fdXNlcm5hbWVJbnB1dC5yZWN0LnRvcCAmJiB5IDwgbV91c2VybmFtZUlucHV0LnJlY3QuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fdXNlcm5hbWVJbnB1dDsKKyAgICBlbHNlIGlmICh4ID5tX3Bhc3N3b3JkSW5wdXQucmVjdC5sZWZ0ICYmIHggPCBtX3Bhc3N3b3JkSW5wdXQucmVjdC5yaWdodCAmJgorICAgICAgICAgICAgIHkgPiBtX3Bhc3N3b3JkSW5wdXQucmVjdC50b3AgJiYgeSA8IG1fcGFzc3dvcmRJbnB1dC5yZWN0LmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX3Bhc3N3b3JkSW5wdXQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWZmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCisKKyNpZm5kZWYgZm9ybVBsdWdpbl9fREVGSU5FRAorI2RlZmluZSBmb3JtUGx1Z2luX19ERUZJTkVECisKK3N0cnVjdCBUZXh0SW5wdXQgeworICAgIEFOUFJlY3RGICAgIHJlY3Q7CisgICAgY2hhciAgICAgICAgdGV4dFszMF07CisgICAgdWludDMyX3QgICAgY2hhclB0cjsKK307CisKK2NsYXNzIEZvcm1QbHVnaW4gOiBwdWJsaWMgU3ViUGx1Z2luIHsKK3B1YmxpYzoKKyAgICBGb3JtUGx1Z2luKE5QUCBpbnN0KTsKKyAgICB2aXJ0dWFsIH5Gb3JtUGx1Z2luKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOworICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOworCisgICAgYm9vbCAgICAgICAgbV9oYXNGb2N1czsKKworICAgIFRleHRJbnB1dCogIG1fYWN0aXZlSW5wdXQ7CisgICAgVGV4dElucHV0ICAgbV91c2VybmFtZUlucHV0OworICAgIFRleHRJbnB1dCAgIG1fcGFzc3dvcmRJbnB1dDsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRJbnB1dDsKKyAgICBBTlBQYWludCogICBtX3BhaW50QWN0aXZlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRUZXh0OworCisgICAgQU5QUmVjdEkgICAgbV92aXNpYmxlUmVjdDsKKworICAgIHZvaWQgZHJhd1RleHQoQU5QQ2FudmFzKiwgVGV4dElucHV0KTsKKyAgICB2b2lkIGRyYXdQYXNzd29yZChBTlBDYW52YXMqLCBUZXh0SW5wdXQpOworCisgICAgYm9vbCBoYW5kbGVOYXZpZ2F0aW9uKEFOUEtleUNvZGUga2V5Q29kZSk7CisgICAgdm9pZCBoYW5kbGVUZXh0SW5wdXQoVGV4dElucHV0KiBpbnB1dCwgQU5QS2V5Q29kZSBrZXlDb2RlLCBpbnQzMl90IHVuaWNoYXIpOworICAgIHZvaWQgc2Nyb2xsSW50b1ZpZXcoVGV4dElucHV0KiBpbnB1dCk7CisgICAgdm9pZCBzd2l0Y2hBY3RpdmVJbnB1dChUZXh0SW5wdXQqIGlucHV0KTsKKworICAgIEFOUFBhaW50KiBnZXRQYWludChUZXh0SW5wdXQqKTsKKyAgICBUZXh0SW5wdXQqIHZhbGlkVGFwKGludCB4LCBpbnQgeSk7CisKK307CisKKyNlbmRpZiAvLyBmb3JtUGx1Z2luX19ERUZJTkVECmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTkwODFjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcApAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKKyNpbmNsdWRlICJBbmltYXRpb25QbHVnaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BsdWdpbi5oIgorI2luY2x1ZGUgIkJhY2tncm91bmRQbHVnaW4uaCIKKyNpbmNsdWRlICJGb3JtUGx1Z2luLmgiCisjaW5jbHVkZSAiUGFpbnRQbHVnaW4uaCIKKyNpbmNsdWRlICJTdXJmYWNlUGx1Z2luLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ucGFwaS5oIgorCitOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CisjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKTsKK05QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpOworTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdyk7CitOUEVycm9yIE5QUF9OZXdTdHJlYW0oTlBQIGluc3RhbmNlLCBOUE1JTUVUeXBlIHR5cGUsIE5QU3RyZWFtKiBzdHJlYW0sCisgICAgICAgIE5QQm9vbCBzZWVrYWJsZSwgdWludDE2KiBzdHlwZSk7CitOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKK2ludDMyICAgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKTsKK2ludDMyICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sCisgICAgICAgIHZvaWQqIGJ1ZmZlcik7Cit2b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7Cit2b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOworaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7Cit2b2lkICAgIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiBVUkwsIE5QUmVhc29uIHJlYXNvbiwKKyAgICAgICAgdm9pZCogbm90aWZ5RGF0YSk7CitOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CitOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7CisKK2V4dGVybiAiQyIgeworRVhQT1JUIE5QRXJyb3IgTlBfSW5pdGlhbGl6ZShOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXJGdW5jcywgTlBQbHVnaW5GdW5jcyogcGx1Z2luRnVuY3MsIHZvaWQgKmphdmFfZW52LCB2b2lkICphcHBsaWNhdGlvbl9jb250ZXh0KTsKK0VYUE9SVCBOUEVycm9yIE5QX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKK0VYUE9SVCBjb25zdCBjaGFyKiBOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCk7CitFWFBPUlQgdm9pZCBOUF9TaHV0ZG93bih2b2lkKTsKK307CisKK0FOUEF1ZGlvVHJhY2tJbnRlcmZhY2VWMCAgICBnU291bmRJOworQU5QQml0bWFwSW50ZXJmYWNlVjAgICAgICAgIGdCaXRtYXBJOworQU5QQ2FudmFzSW50ZXJmYWNlVjAgICAgICAgIGdDYW52YXNJOworQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgICAgIGdMb2dJOworQU5QUGFpbnRJbnRlcmZhY2VWMCAgICAgICAgIGdQYWludEk7CitBTlBQYXRoSW50ZXJmYWNlVjAgICAgICAgICAgZ1BhdGhJOworQU5QU3VyZmFjZUludGVyZmFjZVYwICAgICAgIGdTdXJmYWNlSTsKK0FOUFN5c3RlbUludGVyZmFjZVYwICAgICAgICBnU3lzdGVtSTsKK0FOUFR5cGVmYWNlSW50ZXJmYWNlVjAgICAgICBnVHlwZWZhY2VJOworQU5QV2luZG93SW50ZXJmYWNlVjAgICAgICAgIGdXaW5kb3dJOworCisjZGVmaW5lIEFSUkFZX0NPVU5UKGFycmF5KSAgICAgIChzaXplb2YoYXJyYXkpIC8gc2l6ZW9mKGFycmF5WzBdKSkKKyNkZWZpbmUgREVCVUdfUExVR0lOX0VWRU5UUyAgICAgMAorCitOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2Vudiwgdm9pZCAqYXBwbGljYXRpb25fY29udGV4dCkKK3sKKyAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZ1bmN0aW9uIHRhYmxlIGVxdWFsIG9yIGxhcmdlciB0aGFuIHdlIGFyZSBidWlsdCBhZ2FpbnN0LgorICAgIGlmIChicm93c2VyRnVuY3MtPnNpemUgPCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSkgeworICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBmdW5jdGlvbiB0YWJsZSAoc3RydWN0dXJlKQorICAgIGJyb3dzZXIgPSAoTlBOZXRzY2FwZUZ1bmNzKikgbWFsbG9jKHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKKyAgICBtZW1jcHkoYnJvd3NlciwgYnJvd3NlckZ1bmNzLCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7CisKKyAgICAvLyBCdWlsZCB0aGUgcGx1Z2luIGZ1bmN0aW9uIHRhYmxlCisgICAgcGx1Z2luRnVuY3MtPnZlcnNpb24gPSAxMTsKKyAgICBwbHVnaW5GdW5jcy0+c2l6ZSA9IHNpemVvZihwbHVnaW5GdW5jcyk7CisgICAgcGx1Z2luRnVuY3MtPm5ld3AgPSBOUFBfTmV3OworICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95ID0gTlBQX0Rlc3Ryb3k7CisgICAgcGx1Z2luRnVuY3MtPnNldHdpbmRvdyA9IE5QUF9TZXRXaW5kb3c7CisgICAgcGx1Z2luRnVuY3MtPm5ld3N0cmVhbSA9IE5QUF9OZXdTdHJlYW07CisgICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3lzdHJlYW0gPSBOUFBfRGVzdHJveVN0cmVhbTsKKyAgICBwbHVnaW5GdW5jcy0+YXNmaWxlID0gTlBQX1N0cmVhbUFzRmlsZTsKKyAgICBwbHVnaW5GdW5jcy0+d3JpdGVyZWFkeSA9IE5QUF9Xcml0ZVJlYWR5OworICAgIHBsdWdpbkZ1bmNzLT53cml0ZSA9IChOUFBfV3JpdGVQcm9jUHRyKU5QUF9Xcml0ZTsKKyAgICBwbHVnaW5GdW5jcy0+cHJpbnQgPSBOUFBfUHJpbnQ7CisgICAgcGx1Z2luRnVuY3MtPmV2ZW50ID0gTlBQX0hhbmRsZUV2ZW50OworICAgIHBsdWdpbkZ1bmNzLT51cmxub3RpZnkgPSBOUFBfVVJMTm90aWZ5OworICAgIHBsdWdpbkZ1bmNzLT5nZXR2YWx1ZSA9IE5QUF9HZXRWYWx1ZTsKKyAgICBwbHVnaW5GdW5jcy0+c2V0dmFsdWUgPSBOUFBfU2V0VmFsdWU7CisKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgTlBOVmFyaWFibGUgICAgIHY7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBzaXplOworICAgICAgICBBTlBJbnRlcmZhY2UqICAgaTsKKyAgICB9IGdQYWlyc1tdID0geworICAgICAgICB7IGtBdWRpb1RyYWNrSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgc2l6ZW9mKGdTb3VuZEkpLCAgICAmZ1NvdW5kSSB9LAorICAgICAgICB7IGtCaXRtYXBJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICAgc2l6ZW9mKGdCaXRtYXBJKSwgICAmZ0JpdG1hcEkgfSwKKyAgICAgICAgeyBrQ2FudmFzSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnQ2FudmFzSSksICAgJmdDYW52YXNJIH0sCisgICAgICAgIHsga0xvZ0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgICBzaXplb2YoZ0xvZ0kpLCAgICAgICZnTG9nSSB9LAorICAgICAgICB7IGtQYWludEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgc2l6ZW9mKGdQYWludEkpLCAgICAmZ1BhaW50SSB9LAorICAgICAgICB7IGtQYXRoSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICAgc2l6ZW9mKGdQYXRoSSksICAgICAmZ1BhdGhJIH0sCisgICAgICAgIHsga1N1cmZhY2VJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICAgICBzaXplb2YoZ1N1cmZhY2VJKSwgICZnU3VyZmFjZUkgfSwKKyAgICAgICAgeyBrU3lzdGVtSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgIHNpemVvZihnU3lzdGVtSSksICAgJmdTeXN0ZW1JIH0sCisgICAgICAgIHsga1R5cGVmYWNlSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICBzaXplb2YoZ1R5cGVmYWNlSSksICZnVHlwZWZhY2VJIH0sCisgICAgICAgIHsga1dpbmRvd0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ1dpbmRvd0kpLCAgICZnV2luZG93SSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9DT1VOVChnUGFpcnMpOyBpKyspIHsKKyAgICAgICAgZ1BhaXJzW2ldLmktPmluU2l6ZSA9IGdQYWlyc1tpXS5zaXplOworICAgICAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPmdldHZhbHVlKE5VTEwsIGdQYWlyc1tpXS52LCBnUGFpcnNbaV0uaSk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK3ZvaWQgTlBfU2h1dGRvd24odm9pZCkKK3sKKworfQorCitjb25zdCBjaGFyICpOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCkKK3sKKyAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW46dHN0OlRlc3QgcGx1Z2luIG1pbWV0eXBlIGlzIGFwcGxpY2F0aW9uL3gtdGVzdGJyb3dzZXJwbHVnaW4iOworfQorCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorICAgICAgICAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCit7CisKKyAgICAvKiBCRUdJTjogU1RBTkRBUkQgUExVR0lOIEZSQU1FV09SSyAqLworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gTlVMTDsKKworICAgIC8vIFNjcmlwdGluZyBmdW5jdGlvbnMgYXBwZWFyZWQgaW4gTlBBUEkgdmVyc2lvbiAxNAorICAgIGlmIChicm93c2VyLT52ZXJzaW9uID49IDE0KSB7CisgICAgaW5zdGFuY2UtPnBkYXRhID0gYnJvd3Nlci0+Y3JlYXRlb2JqZWN0IChpbnN0YW5jZSwgZ2V0UGx1Z2luQ2xhc3MoKSk7CisgICAgb2JqID0gc3RhdGljX2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBiemVybyhvYmosIHNpemVvZigqb2JqKSk7CisgICAgfQorICAgIC8qIEVORDogU1RBTkRBUkQgUExVR0lOIEZSQU1FV09SSyAqLworCisgICAgLy8gc2VsZWN0IHRoZSBkcmF3aW5nIG1vZGVsIGJhc2VkIG9uIHVzZXIgaW5wdXQKKyAgICBBTlBEcmF3aW5nTW9kZWwgbW9kZWwgPSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKGFyZ25baV0sICJEcmF3aW5nTW9kZWwiKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIkJpdG1hcCIpKSB7CisgICAgICAgICAgICAgICAgbW9kZWwgPSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIlN1cmZhY2UiKSkgeworICAgICAgICAgICAgICAgbW9kZWwgPSBrU3VyZmFjZV9BTlBEcmF3aW5nTW9kZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tICVwIERyYXdpbmdNb2RlbCBpcyAlZCIsIGluc3RhbmNlLCBtb2RlbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdGlmeSB0aGUgcGx1Z2luIEFQSSBvZiB0aGUgZHJhd2luZyBtb2RlbCB3ZSB3aXNoIHRvIHVzZS4gVGhpcyBtdXN0IGJlCisgICAgLy8gZG9uZSBwcmlvciB0byBjcmVhdGluZyBjZXJ0YWluIHN1YlBsdWdpbiBvYmplY3RzIChlLmcuIHN1cmZhY2VWaWV3cykKKyAgICBOUEVycm9yIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBrUmVxdWVzdERyYXdpbmdNb2RlbF9BTlBTZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihtb2RlbCkpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgInJlcXVlc3QgbW9kZWwgJWQgZXJyICVkIiwgbW9kZWwsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgY29uc3QgY2hhciogcGF0aCA9IGdTeXN0ZW1JLmdldEFwcGxpY2F0aW9uRGF0YURpcmVjdG9yeSgpOworICAgIGlmIChwYXRoKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJBcHBsaWNhdGlvbiBkYXRhIGRpciBpcyAlcyIsIHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJDYW4ndCBmaW5kIEFwcGxpY2F0aW9uIGRhdGEgZGlyIik7CisgICAgfQorCisgICAgLy8gc2VsZWN0IHRoZSBwbHVnaW5UeXBlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnbltpXSwgIlBsdWdpblR5cGUiKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIkFuaW1hdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga0FuaW1hdGlvbl9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEJhbGxBbmltYXRpb24oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQXVkaW8iKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtBdWRpb19QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEF1ZGlvUGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIkJhY2tncm91bmQiKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtCYWNrZ3JvdW5kX1BsdWdpblR5cGU7CisgICAgICAgICAgICAgICAgb2JqLT5hY3RpdmVQbHVnaW4gPSBuZXcgQmFja2dyb3VuZFBsdWdpbihpbnN0YW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICJGb3JtIikpIHsKKyAgICAgICAgICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrRm9ybV9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEZvcm1QbHVnaW4oaW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiUGFpbnQiKSkgeworICAgICAgICAgICAgICAgIG9iai0+cGx1Z2luVHlwZSA9IGtQYWludF9QbHVnaW5UeXBlOworICAgICAgICAgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IFBhaW50UGx1Z2luKGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIlJHQkFfU3VyZmFjZSIpKSB7CisgICAgICAgICAgICAgICAgb2JqLT5wbHVnaW5UeXBlID0ga1N1cmZhY2VfUGx1Z2luVHlwZTsKKyAgICAgICAgICAgICAgICBvYmotPmFjdGl2ZVBsdWdpbiA9IG5ldyBTdXJmYWNlUGx1Z2luKGluc3RhbmNlLCBrUkdCQV9BTlBTdXJmYWNlVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tICVwIFBsdWdpblR5cGUgaXMgJWQiLCBpbnN0YW5jZSwgb2JqLT5wbHVnaW5UeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgbm8gcGx1Z2luVHlwZSBpcyBzcGVjaWZpZWQgdGhlbiBkZWZhdWx0IHRvIEFuaW1hdGlvbgorICAgIGlmICghb2JqLT5wbHVnaW5UeXBlKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICItLS0tLS0gJXAgTm8gUGx1Z2luVHlwZSBhdHRyaWJ1dGUgd2FzIGZvdW5kIiwgaW5zdGFuY2UpOworICAgICAgICBvYmotPnBsdWdpblR5cGUgPSBrQW5pbWF0aW9uX1BsdWdpblR5cGU7CisgICAgICAgIG9iai0+YWN0aXZlUGx1Z2luID0gbmV3IEJhbGxBbmltYXRpb24oaW5zdGFuY2UpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRvIGVuc3VyZSB0aGUgcGx1Z2luVHlwZSBzdXBwb3J0cyB0aGUgbW9kZWwKKyAgICBpZiAoIW9iai0+YWN0aXZlUGx1Z2luLT5zdXBwb3J0c0RyYXdpbmdNb2RlbChtb2RlbCkpIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0tLSAlcCBVbnN1cHBvcnRlZCBEcmF3aW5nTW9kZWwgKCVkKSIsIGluc3RhbmNlLCBtb2RlbCk7CisgICAgICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSkKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7CisgICAgZGVsZXRlIG9iai0+YWN0aXZlUGx1Z2luOworCisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KQoreworICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgIC8vIERvIG5vdGhpbmcgaWYgYnJvd3NlciBkaWRuJ3Qgc3VwcG9ydCBOUE5fQ3JlYXRlT2JqZWN0IHdoaWNoIHdvdWxkIGhhdmUgY3JlYXRlZCB0aGUgUGx1Z2luT2JqZWN0LgorICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICBvYmotPndpbmRvdyA9IHdpbmRvdzsKKyAgICB9CisKKyAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CisKKyAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQoreworICAgICpzdHlwZSA9IE5QX0FTRklMRU9OTFk7CisgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKQoreworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKK30KKworaW50MzIgTlBQX1dyaXRlUmVhZHkoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtKQoreworICAgIHJldHVybiAwOworfQorCitpbnQzMiBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSkKK3sKK30KKwordm9pZCBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KQoreworfQorCitpbnQxNiBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCkKK3sKKyAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKKyAgICBjb25zdCBBTlBFdmVudCogZXZ0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBTlBFdmVudCo+KGV2ZW50KTsKKworI2lmIERFQlVHX1BMVUdJTl9FVkVOVFMKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgorCisgICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmRyYXcubW9kZWwgPT0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWwpIHsKKworICAgICAgICAgICAgICAgIHN0YXRpYyBBTlBCaXRtYXBGb3JtYXQgY3VycmVudEZvcm1hdCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQgIT0gY3VycmVudEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ID0gZXZ0LT5kYXRhLmRyYXcuZGF0YS5iaXRtYXAuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBEcmF3IChiaXRtYXApIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGlwPSVkLCVkLCVkLCVkIGZvcm1hdD0lZCIsIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5jbGlwLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmRyYXcuY2xpcC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEuZHJhdy5kYXRhLmJpdG1hcC5mb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0tleV9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBLZXkgYWN0aW9uPSVkIgorICAgICAgICAgICAgICAgICAgICAgICIgY29kZT0lZCB2Y29kZT0lZCB1bmljaGFyPSVkIHJlcGVhdD0lZCBtb2RzPSV4IiwgaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5uYXRpdmVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkudmlydHVhbENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS51bmljaGFyLAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5rZXkucmVwZWF0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5tb2RpZmllcnMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrTGlmZWN5Y2xlX0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIExpZmVjeWNsZSBhY3Rpb249JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5kYXRhLmxpZmVjeWNsZS5hY3Rpb24pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBUb3VjaCBhY3Rpb249JWQgWyVkICVkXSIsCisgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24sIGV2dC0+ZGF0YS50b3VjaC54LAorICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS50b3VjaC55KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBrTW91c2VfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0gJXAgTW91c2UgYWN0aW9uPSVkIFslZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEubW91c2UuYWN0aW9uLCBldnQtPmRhdGEubW91c2UueCwKKyAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEubW91c2UueSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgIGNhc2Uga1Zpc2libGVSZWN0X0FOUEV2ZW50VHlwZToKKyAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIFZpc2libGVSZWN0IFslZCAlZCAlZCAlZF0iLAorICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC5sZWZ0LCBldnQtPmRhdGEudmlzaWJsZVJlY3QucmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLnZpc2libGVSZWN0LnJlY3QucmlnaHQsIGV2dC0+ZGF0YS52aXNpYmxlUmVjdC5yZWN0LmJvdHRvbSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0gJXAgVW5rbm93biBFdmVudCBbJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgZXZ0LT5ldmVudFR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorI2VuZGlmCisKKyAgICBpZighb2JqLT5hY3RpdmVQbHVnaW4pIHsKKyAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgInRoZSBhY3RpdmUgcGx1Z2luIGlzIG51bGwuIik7CisgICAgICAgIHJldHVybiAwOyAvLyB1bmtub3duIG9yIHVuaGFuZGxlZCBldmVudAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9iai0+YWN0aXZlUGx1Z2luLT5oYW5kbGVFdmVudChldnQpOworICAgIH0KK30KKwordm9pZCBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogdXJsLCBOUFJlYXNvbiByZWFzb24sIHZvaWQqIG5vdGlmeURhdGEpCit7CisKK30KKworRVhQT1JUIE5QRXJyb3IgTlBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpIHsKKworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luTmFtZVN0cmluZykgeworICAgICAgICBjb25zdCBjaGFyICoqc3RyID0gKGNvbnN0IGNoYXIgKiopdmFsdWU7CisgICAgICAgICpzdHIgPSAiVGVzdCBQbHVnaW4iOworICAgICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKHZhcmlhYmxlID09IE5QUFZwbHVnaW5EZXNjcmlwdGlvblN0cmluZykgeworICAgICAgICBjb25zdCBjaGFyICoqc3RyID0gKGNvbnN0IGNoYXIgKiopdmFsdWU7CisgICAgICAgICpzdHIgPSAiRGVzY3JpcHRpb24gb2YgVGVzdCBQbHVnaW4iOworICAgICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cit9CisKK05QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQoreworICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0KSB7CisgICAgICAgIHZvaWQgKip2ID0gKHZvaWQgKiopdmFsdWU7CisgICAgICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKKworICAgICAgICBpZiAob2JqKQorICAgICAgICAgICAgYnJvd3Nlci0+cmV0YWlub2JqZWN0KChOUE9iamVjdCopb2JqKTsKKworICAgICAgICAqdiA9IG9iajsKKyAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOworfQorCitOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKK3sKKyAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMyOTExCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxucGFwaS5oPgorI2luY2x1ZGUgPG5wZnVuY3Rpb25zLmg+CisjaW5jbHVkZSA8bnBydW50aW1lLmg+CisjaW5jbHVkZSAiYW5kcm9pZF9ucGFwaS5oIgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTUyNTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiUGFpbnRQbHVnaW4uaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gTlBOZXRzY2FwZUZ1bmNzKiAgICAgICAgIGJyb3dzZXI7CitleHRlcm4gQU5QTG9nSW50ZXJmYWNlVjAgICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgICBnQ2FudmFzSTsKK2V4dGVybiBBTlBQYWludEludGVyZmFjZVYwICAgICAgZ1BhaW50STsKK2V4dGVybiBBTlBQYXRoSW50ZXJmYWNlVjAgICAgICAgZ1BhdGhJOworZXh0ZXJuIEFOUFN1cmZhY2VJbnRlcmZhY2VWMCAgICBnU3VyZmFjZUk7CitleHRlcm4gQU5QVHlwZWZhY2VJbnRlcmZhY2VWMCAgIGdUeXBlZmFjZUk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUGFpbnRQbHVnaW46OlBhaW50UGx1Z2luKE5QUCBpbnN0KSA6IFN1YlBsdWdpbihpbnN0KSB7CisKKyAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICBtX2lzVG91Y2hDdXJyZW50SW5wdXQgPSB0cnVlOworICAgIG1fYWN0aXZlUGFpbnRDb2xvciA9IHNfcmVkQ29sb3I7CisKKyAgICBtZW1zZXQoJm1fZHJhd2luZ1N1cmZhY2UsIDAsIHNpemVvZihtX2RyYXdpbmdTdXJmYWNlKSk7CisgICAgbWVtc2V0KCZtX2lucHV0VG9nZ2xlLCAgMCwgc2l6ZW9mKG1faW5wdXRUb2dnbGUpKTsKKyAgICBtZW1zZXQoJm1fY29sb3JUb2dnbGUsIDAsIHNpemVvZihtX2NvbG9yVG9nZ2xlKSk7CisgICAgbWVtc2V0KCZtX2NsZWFyU3VyZmFjZSwgIDAsIHNpemVvZihtX2NsZWFyU3VyZmFjZSkpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgZHJhd2luZyBzdXJmYWNlCisgICAgbV9zdXJmYWNlUmVhZHkgPSBmYWxzZTsKKyAgICBtX3N1cmZhY2UgPSBnU3VyZmFjZUkubmV3U3VyZmFjZShpbnN0LCBrUkdCQV9BTlBTdXJmYWNlVHlwZSk7CisgICAgaWYoIW1fc3VyZmFjZSkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSVwIFVuYWJsZSB0byBjcmVhdGUgUkdCQSBzdXJmYWNlIiwgaW5zdCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBwYXRoCisgICAgbV90b3VjaFBhdGggPSBnUGF0aEkubmV3UGF0aCgpOworICAgIGlmKCFtX3RvdWNoUGF0aCkKKyAgICAgICAgZ0xvZ0kubG9nKGluc3QsIGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLSVwIFVuYWJsZSB0byBjcmVhdGUgdGhlIHRvdWNoIHBhdGgiLCBpbnN0KTsKKworICAgIC8vIGluaXRpYWxpemUgdGhlIHBhaW50IGNvbG9ycworICAgIG1fcGFpbnRTdXJmYWNlID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3MobV9wYWludFN1cmZhY2UsIGdQYWludEkuZ2V0RmxhZ3MobV9wYWludFN1cmZhY2UpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludFN1cmZhY2UsIDB4RkZDMEMwQzApOworICAgIGdQYWludEkuc2V0VGV4dFNpemUobV9wYWludFN1cmZhY2UsIDE4KTsKKworICAgIG1fcGFpbnRCdXR0b24gPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50QnV0dG9uLCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnRCdXR0b24pIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludEJ1dHRvbiwgMHhGRkE4QThBOCk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSB0eXBlZmFjZSAoc2V0IHRoZSBjb2xvcnMpCisgICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOworICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludFN1cmZhY2UsIHRmKTsKKyAgICBnVHlwZWZhY2VJLnVucmVmKHRmKTsKKworICAgIC8vcmVnaXN0ZXIgZm9yIHRvdWNoIGV2ZW50cworICAgIEFOUEV2ZW50RmxhZ3MgZmxhZ3MgPSBrVG91Y2hfQU5QRXZlbnRGbGFnOworICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+c2V0dmFsdWUoaW5zdCwga0FjY2VwdEV2ZW50c19BTlBTZXRWYWx1ZSwgJmZsYWdzKTsKKyAgICBpZiAoZXJyICE9IE5QRVJSX05PX0VSUk9SKSB7CisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIkVycm9yIHNlbGVjdGluZyBpbnB1dCBldmVudHMuIik7CisgICAgfQorfQorCitQYWludFBsdWdpbjo6flBhaW50UGx1Z2luKCkgeworICAgIGdTdXJmYWNlSS5kZWxldGVTdXJmYWNlKG1fc3VyZmFjZSk7CisgICAgZ1BhdGhJLmRlbGV0ZVBhdGgobV90b3VjaFBhdGgpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludFN1cmZhY2UpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQobV9wYWludEJ1dHRvbik7Cit9CisKK2Jvb2wgUGFpbnRQbHVnaW46OnN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCBtb2RlbCkgeworICAgIHJldHVybiAobW9kZWwgPT0ga1N1cmZhY2VfQU5QRHJhd2luZ01vZGVsKTsKK30KKworQU5QQ2FudmFzKiBQYWludFBsdWdpbjo6Z2V0Q2FudmFzKEFOUFJlY3RJKiBkaXJ0eVJlY3QpIHsKKworICAgIEFOUEJpdG1hcCBiaXRtYXA7CisgICAgaWYgKCFtX3N1cmZhY2VSZWFkeSB8fCAhZ1N1cmZhY2VJLmxvY2sobV9zdXJmYWNlLCAmYml0bWFwLCBkaXJ0eVJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIEFOUENhbnZhcyogY2FudmFzID0gZ0NhbnZhc0kubmV3Q2FudmFzKCZiaXRtYXApOworCisgICAgLy8gY2xpcCB0aGUgY2FudmFzIHRvIHRoZSBkaXJ0eSByZWN0IGIvYyB0aGUgc3VyZmFjZSBpcyBvbmx5IHJlcXVpcmVkIHRvCisgICAgLy8gY29weSBhIG1pbmltdW0gb2YgdGhlIGRpcnR5IHJlY3QgYW5kIG1heSBjb3B5IG1vcmUuIFRoZSBjbGlwcGVkIGNhbnZhcworICAgIC8vIGhvd2V2ZXIgd2lsbCBuZXZlciB3cml0ZSB0byBwaXhlbHMgb3V0c2lkZSBvZiB0aGUgY2xpcHBlZCBhcmVhLgorICAgIGlmIChkaXJ0eVJlY3QpIHsKKyAgICAgICAgQU5QUmVjdEYgY2xpcFI7CisgICAgICAgIGNsaXBSLmxlZnQgPSBkaXJ0eVJlY3QtPmxlZnQ7CisgICAgICAgIGNsaXBSLnRvcCA9IGRpcnR5UmVjdC0+dG9wOworICAgICAgICBjbGlwUi5yaWdodCA9IGRpcnR5UmVjdC0+cmlnaHQ7CisgICAgICAgIGNsaXBSLmJvdHRvbSA9IGRpcnR5UmVjdC0+Ym90dG9tOworICAgICAgICBnQ2FudmFzSS5jbGlwUmVjdChjYW52YXMsICZjbGlwUik7CisgICAgfQorCisgICAgcmV0dXJuIGNhbnZhczsKK30KKworQU5QQ2FudmFzKiBQYWludFBsdWdpbjo6Z2V0Q2FudmFzKEFOUFJlY3RGKiBkaXJ0eVJlY3QpIHsKKworICAgIEFOUFJlY3RJIG5ld1JlY3Q7CisgICAgbmV3UmVjdC5sZWZ0ID0gKGludCkgZGlydHlSZWN0LT5sZWZ0OworICAgIG5ld1JlY3QudG9wID0gKGludCkgZGlydHlSZWN0LT50b3A7CisgICAgbmV3UmVjdC5yaWdodCA9IChpbnQpIGRpcnR5UmVjdC0+cmlnaHQ7CisgICAgbmV3UmVjdC5ib3R0b20gPSAoaW50KSBkaXJ0eVJlY3QtPmJvdHRvbTsKKworICAgIHJldHVybiBnZXRDYW52YXMoJm5ld1JlY3QpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpyZWxlYXNlQ2FudmFzKEFOUENhbnZhcyogY2FudmFzKSB7CisgICAgZ1N1cmZhY2VJLnVubG9jayhtX3N1cmZhY2UpOworICAgIGdDYW52YXNJLmRlbGV0ZUNhbnZhcyhjYW52YXMpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjpkcmF3Q2xlYW5QbHVnaW4oQU5QQ2FudmFzKiBjYW52YXMpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworCisgICAgLy8gaWYgbm8gY2FudmFzIGdldCBhIGxvY2tlZCBjYW52YXMKKyAgICBpZiAoIWNhbnZhcykKKyAgICAgICAgY2FudmFzID0gZ2V0Q2FudmFzKCk7CisKKyAgICBpZiAoIWNhbnZhcykKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgZmxvYXQgYnV0dG9uV2lkdGggPSA2MDsKKyAgICBjb25zdCBmbG9hdCBidXR0b25IZWlnaHQgPSAzMDsKKyAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKKyAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7CisKKyAgICAvLyBjb2xvciB0aGUgcGx1Z2luIGNhbnZhcworICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZDRENEQ0QpOworCisgICAgLy8gZ2V0IGZvbnQgbWV0cmljcworICAgIEFOUEZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzOworICAgIGdQYWludEkuZ2V0Rm9udE1ldHJpY3MobV9wYWludFN1cmZhY2UsICZmb250TWV0cmljcyk7CisKKyAgICAvLyBkcmF3IHRoZSBpbnB1dCB0b2dnbGUgYnV0dG9uCisgICAgbV9pbnB1dFRvZ2dsZS5sZWZ0ID0gNTsKKyAgICBtX2lucHV0VG9nZ2xlLnRvcCA9IEggLSBidXR0b25IZWlnaHQgLSA1OworICAgIG1faW5wdXRUb2dnbGUucmlnaHQgPSBtX2lucHV0VG9nZ2xlLmxlZnQgKyBidXR0b25XaWR0aDsKKyAgICBtX2lucHV0VG9nZ2xlLmJvdHRvbSA9IG1faW5wdXRUb2dnbGUudG9wICsgYnV0dG9uSGVpZ2h0OworICAgIGdDYW52YXNJLmRyYXdSZWN0KGNhbnZhcywgJm1faW5wdXRUb2dnbGUsIG1fcGFpbnRCdXR0b24pOworICAgIGNvbnN0IGNoYXIqIGlucHV0VGV4dCA9IG1faXNUb3VjaEN1cnJlbnRJbnB1dCA/ICJUb3VjaCIgOiAiTW91c2UiOworICAgIGdDYW52YXNJLmRyYXdUZXh0KGNhbnZhcywgaW5wdXRUZXh0LCBzdHJsZW4oaW5wdXRUZXh0KSwgbV9pbnB1dFRvZ2dsZS5sZWZ0ICsgNSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2lucHV0VG9nZ2xlLnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIGRyYXcgdGhlIGNvbG9yIHNlbGVjdG9yIGJ1dHRvbgorICAgIG1fY29sb3JUb2dnbGUubGVmdCA9IChXLzIpIC0gKGJ1dHRvbldpZHRoLzIpOworICAgIG1fY29sb3JUb2dnbGUudG9wID0gSCAtIGJ1dHRvbkhlaWdodCAtIDU7CisgICAgbV9jb2xvclRvZ2dsZS5yaWdodCA9IG1fY29sb3JUb2dnbGUubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fY29sb3JUb2dnbGUuYm90dG9tID0gbV9jb2xvclRvZ2dsZS50b3AgKyBidXR0b25IZWlnaHQ7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9jb2xvclRvZ2dsZSwgbV9wYWludEJ1dHRvbik7CisgICAgY29uc3QgY2hhciogY29sb3JUZXh0ID0gZ2V0Q29sb3JUZXh0KCk7CisgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCBjb2xvclRleHQsIHN0cmxlbihjb2xvclRleHQpLCBtX2NvbG9yVG9nZ2xlLmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fY29sb3JUb2dnbGUudG9wIC0gZm9udE1ldHJpY3MuZlRvcCwgbV9wYWludFN1cmZhY2UpOworCisgICAgLy8gZHJhdyB0aGUgY2xlYXIgY2FudmFzIGJ1dHRvbgorICAgIG1fY2xlYXJTdXJmYWNlLmxlZnQgPSBXIC0gYnV0dG9uV2lkdGggLSA1OworICAgIG1fY2xlYXJTdXJmYWNlLnRvcCA9IEggLSBidXR0b25IZWlnaHQgLSA1OworICAgIG1fY2xlYXJTdXJmYWNlLnJpZ2h0ID0gbV9jbGVhclN1cmZhY2UubGVmdCArIGJ1dHRvbldpZHRoOworICAgIG1fY2xlYXJTdXJmYWNlLmJvdHRvbSA9IG1fY2xlYXJTdXJmYWNlLnRvcCArIGJ1dHRvbkhlaWdodDsKKyAgICBnQ2FudmFzSS5kcmF3UmVjdChjYW52YXMsICZtX2NsZWFyU3VyZmFjZSwgbV9wYWludEJ1dHRvbik7CisgICAgY29uc3QgY2hhciogY2xlYXJUZXh0ID0gIkNsZWFyIjsKKyAgICBnQ2FudmFzSS5kcmF3VGV4dChjYW52YXMsIGNsZWFyVGV4dCwgc3RybGVuKGNsZWFyVGV4dCksIG1fY2xlYXJTdXJmYWNlLmxlZnQgKyA1LAorICAgICAgICAgICAgICAgICAgICAgIG1fY2xlYXJTdXJmYWNlLnRvcCAtIGZvbnRNZXRyaWNzLmZUb3AsIG1fcGFpbnRTdXJmYWNlKTsKKworICAgIC8vIGRyYXcgdGhlIGRyYXdpbmcgc3VyZmFjZSBib3ggKDUgcHggZnJvbSB0aGUgZWRnZSkKKyAgICBtX2RyYXdpbmdTdXJmYWNlLmxlZnQgPSA1OworICAgIG1fZHJhd2luZ1N1cmZhY2UudG9wID0gNTsKKyAgICBtX2RyYXdpbmdTdXJmYWNlLnJpZ2h0ID0gVyAtIDU7CisgICAgbV9kcmF3aW5nU3VyZmFjZS5ib3R0b20gPSBtX2NvbG9yVG9nZ2xlLnRvcCAtIDU7CisgICAgZ0NhbnZhc0kuZHJhd1JlY3QoY2FudmFzLCAmbV9kcmF3aW5nU3VyZmFjZSwgbV9wYWludFN1cmZhY2UpOworCisgICAgLy8gcmVsZWFzZSB0aGUgY2FudmFzCisgICAgcmVsZWFzZUNhbnZhcyhjYW52YXMpOworfQorCitjb25zdCBjaGFyKiBQYWludFBsdWdpbjo6Z2V0Q29sb3JUZXh0KCkgeworCisgICAgaWYgKG1fYWN0aXZlUGFpbnRDb2xvciA9PSBzX2JsdWVDb2xvcikKKyAgICAgICAgcmV0dXJuICJCbHVlIjsKKyAgICBlbHNlIGlmIChtX2FjdGl2ZVBhaW50Q29sb3IgPT0gc19ncmVlbkNvbG9yKQorICAgICAgICByZXR1cm4gIkdyZWVuIjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiUmVkIjsKK30KKworaW50MTYgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKKyAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CisgICAgICAgIGNhc2Uga1N1cmZhY2VfQU5QRXZlbnRUeXBlOgorICAgICAgICAgICAgc3dpdGNoIChldnQtPmRhdGEuc3VyZmFjZS5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtDcmVhdGVkX0FOUFN1cmZhY2VBY3Rpb246CisgICAgICAgICAgICAgICAgICAgIG1fc3VyZmFjZVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZHJhd0NsZWFuUGx1Z2luKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGNhc2Uga0Rlc3Ryb3llZF9BTlBTdXJmYWNlQWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3N1cmZhY2VSZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZTogeworICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCkgZXZ0LT5kYXRhLnRvdWNoLng7CisgICAgICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KSBldnQtPmRhdGEudG91Y2gueTsKKyAgICAgICAgICAgIGlmIChrRG93bl9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1faXNUb3VjaEN1cnJlbnRJbnB1dCkgeworCisgICAgICAgICAgICAgICAgQU5QUmVjdEYqIHJlY3QgPSB2YWxpZFRvdWNoKGV2dC0+ZGF0YS50b3VjaC54LCBldnQtPmRhdGEudG91Y2gueSk7CisgICAgICAgICAgICAgICAgaWYocmVjdCA9PSAmbV9kcmF3aW5nU3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBnUGF0aEkubW92ZVRvKG1fdG91Y2hQYXRoLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgcGFpbnRUb3VjaCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa01vdmVfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbiAmJiBtX2lzVG91Y2hBY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBnUGF0aEkubGluZVRvKG1fdG91Y2hQYXRoLCB4LCB5KTsKKyAgICAgICAgICAgICAgICBwYWludFRvdWNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtVcF9BTlBUb3VjaEFjdGlvbiA9PSBldnQtPmRhdGEudG91Y2guYWN0aW9uICYmIG1faXNUb3VjaEFjdGl2ZSkgeworICAgICAgICAgICAgICAgIGdQYXRoSS5saW5lVG8obV90b3VjaFBhdGgsIHgsIHkpOworICAgICAgICAgICAgICAgIHBhaW50VG91Y2goKTsKKyAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnUGF0aEkucmVzZXQobV90b3VjaFBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChrQ2FuY2VsX0FOUFRvdWNoQWN0aW9uID09IGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtX2lzVG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBnUGF0aEkucmVzZXQobV90b3VjaFBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtNb3VzZV9BTlBFdmVudFR5cGU6IHsKKworICAgICAgICAgICAgaWYgKG1faXNUb3VjaEFjdGl2ZSkKKyAgICAgICAgICAgICAgICBnTG9nSS5sb2coaW5zdCgpLCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0lcCBSZWNlaXZlZCB1bmludGVuZGVkIG1vdXNlIGV2ZW50IiwgaW5zdCgpKTsKKworICAgICAgICAgICAgaWYgKGtEb3duX0FOUE1vdXNlQWN0aW9uID09IGV2dC0+ZGF0YS5tb3VzZS5hY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBBTlBSZWN0RiogcmVjdCA9IHZhbGlkVG91Y2goZXZ0LT5kYXRhLm1vdXNlLngsIGV2dC0+ZGF0YS5tb3VzZS55KTsKKyAgICAgICAgICAgICAgICBpZiAocmVjdCA9PSAmbV9kcmF3aW5nU3VyZmFjZSkKKyAgICAgICAgICAgICAgICAgICAgcGFpbnRNb3VzZShldnQtPmRhdGEubW91c2UueCwgZXZ0LT5kYXRhLm1vdXNlLnkpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QgPT0gJm1faW5wdXRUb2dnbGUpCisgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUlucHV0TWV0aG9kKCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjdCA9PSAmbV9jb2xvclRvZ2dsZSkKKyAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUGFpbnRDb2xvcigpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlY3QgPT0gJm1fY2xlYXJTdXJmYWNlKQorICAgICAgICAgICAgICAgICAgICBkcmF3Q2xlYW5QbHVnaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7ICAgLy8gdW5rbm93biBvciB1bmhhbmRsZWQgZXZlbnQKK30KKworQU5QUmVjdEYqIFBhaW50UGx1Z2luOjp2YWxpZFRvdWNoKGludCB4LCBpbnQgeSkgeworCisgICAgLy9jb252ZXJ0IHRvIGZsb2F0CisgICAgZmxvYXQgZnggPSAoaW50KSB4OworICAgIGZsb2F0IGZ5ID0gKGludCkgeTsKKworICAgIGlmIChmeCA+IG1fZHJhd2luZ1N1cmZhY2UubGVmdCAmJiBmeCA8IG1fZHJhd2luZ1N1cmZhY2UucmlnaHQgJiYgZnkgPiBtX2RyYXdpbmdTdXJmYWNlLnRvcCAmJiBmeSA8IG1fZHJhd2luZ1N1cmZhY2UuYm90dG9tKQorICAgICAgICByZXR1cm4gJm1fZHJhd2luZ1N1cmZhY2U7CisgICAgZWxzZSBpZiAoZnggPiBtX2lucHV0VG9nZ2xlLmxlZnQgJiYgZnggPCBtX2lucHV0VG9nZ2xlLnJpZ2h0ICYmIGZ5ID4gbV9pbnB1dFRvZ2dsZS50b3AgJiYgZnkgPCBtX2lucHV0VG9nZ2xlLmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX2lucHV0VG9nZ2xlOworICAgIGVsc2UgaWYgKGZ4ID4gbV9jb2xvclRvZ2dsZS5sZWZ0ICYmIGZ4IDwgbV9jb2xvclRvZ2dsZS5yaWdodCAmJiBmeSA+IG1fY29sb3JUb2dnbGUudG9wICYmIGZ5IDwgbV9jb2xvclRvZ2dsZS5ib3R0b20pCisgICAgICAgIHJldHVybiAmbV9jb2xvclRvZ2dsZTsKKyAgICBlbHNlIGlmIChmeCA+IG1fY2xlYXJTdXJmYWNlLmxlZnQgJiYgZnggPCBtX2NsZWFyU3VyZmFjZS5yaWdodCAmJiBmeSA+IG1fY2xlYXJTdXJmYWNlLnRvcCAmJiBmeSA8IG1fY2xlYXJTdXJmYWNlLmJvdHRvbSkKKyAgICAgICAgcmV0dXJuICZtX2NsZWFyU3VyZmFjZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBhaW50UGx1Z2luOjp0b2dnbGVJbnB1dE1ldGhvZCgpIHsKKyAgICBtX2lzVG91Y2hDdXJyZW50SW5wdXQgPSAhbV9pc1RvdWNoQ3VycmVudElucHV0OworCisgICAgLy8gbG9jayBvbmx5IHRoZSBpbnB1dCB0b2dnbGUgYW5kIHJlZHJhdyB0aGUgY2FudmFzCisgICAgQU5QQ2FudmFzKiBsb2NrZWRDYW52YXMgPSBnZXRDYW52YXMoJm1faW5wdXRUb2dnbGUpOworICAgIGRyYXdDbGVhblBsdWdpbihsb2NrZWRDYW52YXMpOworfQorCit2b2lkIFBhaW50UGx1Z2luOjp0b2dnbGVQYWludENvbG9yKCkgeworICAgIGlmIChtX2FjdGl2ZVBhaW50Q29sb3IgPT0gc19ibHVlQ29sb3IpCisgICAgICAgIG1fYWN0aXZlUGFpbnRDb2xvciA9IHNfcmVkQ29sb3I7CisgICAgZWxzZSBpZiAobV9hY3RpdmVQYWludENvbG9yID09IHNfZ3JlZW5Db2xvcikKKyAgICAgICAgbV9hY3RpdmVQYWludENvbG9yID0gc19ibHVlQ29sb3I7CisgICAgZWxzZQorICAgICAgICBtX2FjdGl2ZVBhaW50Q29sb3IgPSBzX2dyZWVuQ29sb3I7CisKKyAgICAvLyBsb2NrIG9ubHkgdGhlIGNvbG9yIHRvZ2dsZSBhbmQgcmVkcmF3IHRoZSBjYW52YXMKKyAgICBBTlBDYW52YXMqIGxvY2tlZENhbnZhcyA9IGdldENhbnZhcygmbV9jb2xvclRvZ2dsZSk7CisgICAgZHJhd0NsZWFuUGx1Z2luKGxvY2tlZENhbnZhcyk7Cit9CisKK3ZvaWQgUGFpbnRQbHVnaW46OnBhaW50TW91c2UoaW50IHgsIGludCB5KSB7CisgICAgLy9UT0RPIGRvIG5vdCBwYWludCBvdXRzaWRlIHRoZSBkcmF3aW5nIHN1cmZhY2UKKworICAgIC8vY3JlYXRlIHRoZSBwYWludCBjb2xvcgorICAgIEFOUFBhaW50KiBmaWxsUGFpbnQgPSBnUGFpbnRJLm5ld1BhaW50KCk7CisgICAgZ1BhaW50SS5zZXRGbGFncyhmaWxsUGFpbnQsIGdQYWludEkuZ2V0RmxhZ3MoZmlsbFBhaW50KSB8IGtBbnRpQWxpYXNfQU5QUGFpbnRGbGFnKTsKKyAgICBnUGFpbnRJLnNldFN0eWxlKGZpbGxQYWludCwga0ZpbGxfQU5QUGFpbnRTdHlsZSk7CisgICAgZ1BhaW50SS5zZXRDb2xvcihmaWxsUGFpbnQsIG1fYWN0aXZlUGFpbnRDb2xvcik7CisKKyAgICAvLyBoYW5kbGUgdGhlIHNpbXBsZSAibW91c2UiIHBhaW50IChkcmF3IGEgcG9pbnQpCisgICAgQU5QUmVjdEYgcG9pbnQ7CisgICAgcG9pbnQubGVmdCA9ICAgKGZsb2F0KSB4LTM7CisgICAgcG9pbnQudG9wID0gICAgKGZsb2F0KSB5LTM7CisgICAgcG9pbnQucmlnaHQgPSAgKGZsb2F0KSB4KzM7CisgICAgcG9pbnQuYm90dG9tID0gKGZsb2F0KSB5KzM7CisKKyAgICAvLyBnZXQgYSBjYW52YXMgdGhhdCBpcyBvbmx5IGxvY2tlZCBhcm91bmQgdGhlIHBvaW50IGFuZCBkcmF3IGl0CisgICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnZXRDYW52YXMoJnBvaW50KTsKKyAgICBnQ2FudmFzSS5kcmF3T3ZhbChjYW52YXMsICZwb2ludCwgZmlsbFBhaW50KTsKKworICAgIC8vIGNsZWFuIHVwCisgICAgcmVsZWFzZUNhbnZhcyhjYW52YXMpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQoZmlsbFBhaW50KTsKK30KKwordm9pZCBQYWludFBsdWdpbjo6cGFpbnRUb3VjaCgpIHsKKyAgICAvL1RPRE8gZG8gbm90IHBhaW50IG91dHNpZGUgdGhlIGRyYXdpbmcgc3VyZmFjZQorCisgICAgLy9jcmVhdGUgdGhlIHBhaW50IGNvbG9yCisgICAgQU5QUGFpbnQqIHN0cm9rZVBhaW50ID0gZ1BhaW50SS5uZXdQYWludCgpOworICAgIGdQYWludEkuc2V0RmxhZ3Moc3Ryb2tlUGFpbnQsIGdQYWludEkuZ2V0RmxhZ3Moc3Ryb2tlUGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOworICAgIGdQYWludEkuc2V0Q29sb3Ioc3Ryb2tlUGFpbnQsIG1fYWN0aXZlUGFpbnRDb2xvcik7CisgICAgZ1BhaW50SS5zZXRTdHlsZShzdHJva2VQYWludCwga1N0cm9rZV9BTlBQYWludFN0eWxlKTsKKyAgICBnUGFpbnRJLnNldFN0cm9rZVdpZHRoKHN0cm9rZVBhaW50LCA2LjApOworICAgIGdQYWludEkuc2V0U3Ryb2tlQ2FwKHN0cm9rZVBhaW50LCBrUm91bmRfQU5QUGFpbnRDYXApOworICAgIGdQYWludEkuc2V0U3Ryb2tlSm9pbihzdHJva2VQYWludCwga1JvdW5kX0FOUFBhaW50Sm9pbik7CisKKyAgICAvLyBoYW5kbGUgdGhlIGNvbXBsZXggInRvdWNoIiBwYWludCAoZHJhdyBhIGxpbmUpCisgICAgQU5QUmVjdEYgYm91bmRzOworICAgIGdQYXRoSS5nZXRCb3VuZHMobV90b3VjaFBhdGgsICZib3VuZHMpOworCisgICAgLy8gZ2V0IGEgY2FudmFzIHRoYXQgaXMgb25seSBsb2NrZWQgYXJvdW5kIHRoZSBwb2ludCBhbmQgZHJhdyB0aGUgcGF0aAorICAgIEFOUENhbnZhcyogY2FudmFzID0gZ2V0Q2FudmFzKCZib3VuZHMpOworICAgIGdDYW52YXNJLmRyYXdQYXRoKGNhbnZhcywgbV90b3VjaFBhdGgsIHN0cm9rZVBhaW50KTsKKworICAgIC8vIGNsZWFuIHVwCisgICAgcmVsZWFzZUNhbnZhcyhjYW52YXMpOworICAgIGdQYWludEkuZGVsZXRlUGFpbnQoc3Ryb2tlUGFpbnQpOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmYyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJQbHVnaW5PYmplY3QuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIHBhaW50UGx1Z2luX19ERUZJTkVECisjZGVmaW5lIHBhaW50UGx1Z2luX19ERUZJTkVECisKK2NsYXNzIFBhaW50UGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgUGFpbnRQbHVnaW4oTlBQIGluc3QpOworICAgIHZpcnR1YWwgflBhaW50UGx1Z2luKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7CisgICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKK3ByaXZhdGU6CisgICAgdm9pZCAgICAgICAgZHJhd0NsZWFuUGx1Z2luKEFOUENhbnZhcyogY2FudmFzID0gTlVMTCk7CisgICAgQU5QQ2FudmFzKiAgZ2V0Q2FudmFzKEFOUFJlY3RJKiBkaXJ0eVJlY3QgPSBOVUxMKTsKKyAgICBBTlBDYW52YXMqICBnZXRDYW52YXMoQU5QUmVjdEYqIGRpcnR5UmVjdCk7CisgICAgY29uc3QgY2hhciogZ2V0Q29sb3JUZXh0KCk7CisgICAgdm9pZCAgICAgICAgcGFpbnRNb3VzZShpbnQgeCwgaW50IHkpOworICAgIHZvaWQgICAgICAgIHBhaW50VG91Y2goKTsKKyAgICB2b2lkICAgICAgICByZWxlYXNlQ2FudmFzKEFOUENhbnZhcyopOworICAgIHZvaWQgICAgICAgIHRvZ2dsZUlucHV0TWV0aG9kKCk7CisgICAgdm9pZCAgICAgICAgdG9nZ2xlUGFpbnRDb2xvcigpOworICAgIEFOUFJlY3RGKiAgIHZhbGlkVG91Y2goaW50IHgsIGludCB5KTsKKworICAgIGJvb2wgICAgICAgIG1faXNUb3VjaEFjdGl2ZTsKKyAgICBib29sICAgICAgICBtX2lzVG91Y2hDdXJyZW50SW5wdXQ7CisgICAgYm9vbCAgICAgICAgbV9zdXJmYWNlUmVhZHk7CisKKyAgICBBTlBTdXJmYWNlKiBtX3N1cmZhY2U7CisgICAgQU5QUGF0aCogICAgbV90b3VjaFBhdGg7CisKKyAgICBBTlBSZWN0RiAgICBtX2RyYXdpbmdTdXJmYWNlOworICAgIEFOUFJlY3RGICAgIG1faW5wdXRUb2dnbGU7CisgICAgQU5QUmVjdEYgICAgbV9jb2xvclRvZ2dsZTsKKyAgICBBTlBSZWN0RiAgICBtX2NsZWFyU3VyZmFjZTsKKworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRTdXJmYWNlOworICAgIEFOUFBhaW50KiAgIG1fcGFpbnRCdXR0b247CisKKyAgICBBTlBDb2xvciAgICBtX2FjdGl2ZVBhaW50Q29sb3I7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfcmVkQ29sb3IgICA9IDB4RkZGRjAwMDA7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfZ3JlZW5Db2xvciA9IDB4RkYwMEZGMDA7CisgICAgc3RhdGljIGNvbnN0IEFOUENvbG9yIHNfYmx1ZUNvbG9yICA9IDB4RkYwMDAwRkY7Cit9OworCisjZW5kaWYgLy8gcGFpbnRQbHVnaW5fX0RFRklORUQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvc3VyZmFjZS9TdXJmYWNlUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvc3VyZmFjZS9TdXJmYWNlUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JlOTBhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9zdXJmYWNlL1N1cmZhY2VQbHVnaW4uY3BwCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiU3VyZmFjZVBsdWdpbi5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2V4dGVybiBOUE5ldHNjYXBlRnVuY3MqICAgICAgICBicm93c2VyOworZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgIGdMb2dJOworZXh0ZXJuIEFOUFBhaW50SW50ZXJmYWNlVjAgICAgIGdQYWludEk7CitleHRlcm4gQU5QU3VyZmFjZUludGVyZmFjZVYwICAgZ1N1cmZhY2VJOworZXh0ZXJuIEFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgIGdUeXBlZmFjZUk7CitleHRlcm4gQU5QV2luZG93SW50ZXJmYWNlVjAgICAgZ1dpbmRvd0k7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU3VyZmFjZVBsdWdpbjo6U3VyZmFjZVBsdWdpbihOUFAgaW5zdCwgQU5QU3VyZmFjZVR5cGUgc3VyZmFjZVR5cGUpIDogU3ViUGx1Z2luKGluc3QpIHsKKworICAgIG1fc3VyZmFjZSA9IGdTdXJmYWNlSS5uZXdTdXJmYWNlKGluc3QsIHN1cmZhY2VUeXBlKTsKKworICAgIGlmKCFtX3N1cmZhY2UpCisgICAgICAgIGdMb2dJLmxvZyhpbnN0LCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0lcCBVbmFibGUgdG8gY3JlYXRlIHN1cmZhY2UgKCVkKSIsIGluc3QsIHN1cmZhY2VUeXBlKTsKK30KKworU3VyZmFjZVBsdWdpbjo6flN1cmZhY2VQbHVnaW4oKSB7CisgICAgaWYgKG1fc3VyZmFjZSkKKyAgICAgICAgZ1N1cmZhY2VJLmRlbGV0ZVN1cmZhY2UobV9zdXJmYWNlKTsKK30KKworYm9vbCBTdXJmYWNlUGx1Z2luOjpzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwgbW9kZWwpIHsKKyAgICByZXR1cm4gKG1vZGVsID09IGtTdXJmYWNlX0FOUERyYXdpbmdNb2RlbCk7Cit9CisKK3ZvaWQgU3VyZmFjZVBsdWdpbjo6ZHJhdygpIHsKKyAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CisgICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOworCisgICAgQU5QQml0bWFwIGJpdG1hcDsKKworICAgIGJvb2wgdmFsdWUgPSBnU3VyZmFjZUkubG9jayhtX3N1cmZhY2UsICZiaXRtYXAsIE5VTEwpOworICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tJXAgbG9ja2luZzogJWIiLCBpbnN0YW5jZSwgdmFsdWUpOworICAgIGdTdXJmYWNlSS51bmxvY2sobV9zdXJmYWNlKTsKK30KKworaW50MTYgU3VyZmFjZVBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKKworICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKKyAgICAgICAgY2FzZSBrRHJhd19BTlBFdmVudFR5cGU6CisgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5kcmF3Lm1vZGVsKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrU3VyZmFjZV9BTlBEcmF3aW5nTW9kZWw6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3N1cmZhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgIC8vIHVua25vd24gZHJhd2luZyBtb2RlbAorICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3N1cmZhY2UvU3VyZmFjZVBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9zdXJmYWNlL1N1cmZhY2VQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlmOGIxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9zdXJmYWNlL1N1cmZhY2VQbHVnaW4uaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgorCisjaWZuZGVmIHN1cmZhY2VQbHVnaW5fX0RFRklORUQKKyNkZWZpbmUgc3VyZmFjZVBsdWdpbl9fREVGSU5FRAorCitjbGFzcyBTdXJmYWNlUGx1Z2luIDogcHVibGljIFN1YlBsdWdpbiB7CitwdWJsaWM6CisgICAgU3VyZmFjZVBsdWdpbihOUFAgaW5zdCwgQU5QU3VyZmFjZVR5cGUgc3VyZmFjZVR5cGUpOworICAgIHZpcnR1YWwgflN1cmZhY2VQbHVnaW4oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKTsKKyAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworcHJpdmF0ZToKKyAgICB2b2lkIGRyYXcoKTsKKyAgICBBTlBTdXJmYWNlKiBtX3N1cmZhY2U7CisKK307CisjZW5kaWYgLy8gc3VyZmFjZVBsdWdpbl9fREVGSU5FRApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS9zYW1wbGVfYnJvd3Nlcl9wbHVnaW4ucG5nIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy9kcmF3YWJsZS9zYW1wbGVfYnJvd3Nlcl9wbHVnaW4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3Yzc5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL2RyYXdhYmxlL3NhbXBsZV9icm93c2VyX3BsdWdpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhkZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgPHN0cmluZyBuYW1lPSJzYW1wbGVfYnJvd3Nlcl9wbHVnaW4iPlNhbXBsZSBCcm93c2VyIFBsdWdpbjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9TYW1wbGVQbHVnaW4uamF2YSBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9zcmMvY29tL2FuZHJvaWQvc2FtcGxlcGx1Z2luL1NhbXBsZVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGNlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vc3JjL2NvbS9hbmRyb2lkL3NhbXBsZXBsdWdpbi9TYW1wbGVQbHVnaW4uamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnNhbXBsZXBsdWdpbjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBTZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkLm1rIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTYyY2I5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRml4ZWRHcmlkTGF5b3V0CisKK0xPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNkMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQuZml4ZWRncmlkbGF5b3V0IgorICAgICAgYW5kcm9pZDp2ZXJzaW9uQ29kZT0iMSIKKyAgICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuRml4ZWRHcmlkTGF5b3V0VGVzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9kcmF3YWJsZS9idWdkcm9pZC5wbmcgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvZHJhd2FibGUvYnVnZHJvaWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTQ4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvZHJhd2FibGUvYnVnZHJvaWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy9sYXlvdXQvbWFpbi54bWwgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvbGF5b3V0L21haW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTJkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvbGF5b3V0L21haW4ueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8Y29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQuRml4ZWRHcmlkTGF5b3V0CisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgeG1sbnM6YXBwPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2NvbS5leGFtcGxlLmFuZHJvaWQuZml4ZWRncmlkbGF5b3V0IgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2dyaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgYXBwOmNlbGxXaWR0aD0iODBkcCIKKyAgICAgICAgYXBwOmNlbGxIZWlnaHQ9IjEwMGRwIgorICAgICAgICA+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9idWdkcm9pZCIKKyAgICAgICAgLz4KKyAgICA8SW1hZ2VWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2J1Z2Ryb2lkIgorICAgICAgICAvPgorICAgIDxJbWFnZVZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvYnVnZHJvaWQiCisgICAgICAgIC8+Cis8L2NvbS5leGFtcGxlLmFuZHJvaWQuZml4ZWRncmlkbGF5b3V0LkZpeGVkR3JpZExheW91dD4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL2F0dHJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg3ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTAsMCArMSw3IEBACis8cmVzb3VyY2VzPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJGaXhlZEdyaWRMYXlvdXQiPgorICAgICAgICA8YXR0ciBuYW1lPSJjZWxsV2lkdGgiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgICAgICA8YXR0ciBuYW1lPSJjZWxsSGVpZ2h0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTYzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxyZXNvdXJjZXM+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbmFtZSI+Rml4ZWRHcmlkTGF5b3V0VGVzdDwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0LmphdmEgYi9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzMTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvRml4ZWRHcmlkTGF5b3V0L3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2ZpeGVkZ3JpZGxheW91dC9GaXhlZEdyaWRMYXlvdXQuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5maXhlZGdyaWRsYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOworCisvKioKKyAqIEEgbGF5b3V0IHRoYXQgYXJyYW5nZXMgaXRzIGNoaWxkcmVuIGluIGEgZ3JpZC4gIFRoZSBzaXplIG9mIHRoZQorICogY2VsbHMgaXMgc2V0IGJ5IHRoZSB7QGxpbmsgI3NldENlbGxTaXplfSBtZXRob2QgYW5kIHRoZQorICogYW5kcm9pZDpjZWxsX3dpZHRoIGFuZCBhbmRyb2lkOmNlbGxfaGVpZ2h0IGF0dHJpYnV0ZXMgaW4gWE1MLgorICogVGhlIG51bWJlciBvZiByb3dzIGFuZCBjb2x1bW5zIGlzIGRldGVybWluZWQgYXQgcnVudGltZS4gIEVhY2gKKyAqIGNlbGwgY29udGFpbnMgZXhhY3RseSBvbmUgdmlldywgYW5kIHRoZXkgZmxvdyBpbiB0aGUgbmF0dXJhbAorICogY2hpbGQgb3JkZXIgKHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQsIG9yIHRoZSBpbmRleAorICogaW4ge0BsaW5rICNhZGRWaWV3QXR9LiAgVmlld3MgY2FuIG5vdCBzcGFuIG11bHRpcGxlIGNlbGxzLgorICovCitwdWJsaWMgY2xhc3MgRml4ZWRHcmlkTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBpbnQgbUNlbGxXaWR0aDsKKyAgICBpbnQgbUNlbGxIZWlnaHQ7CisKKyAgICBwdWJsaWMgRml4ZWRHcmlkTGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgRml4ZWRHcmlkTGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICAvLyBSZWFkIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGVzLgorICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgYXR0cnMsIFIuc3R5bGVhYmxlLkZpeGVkR3JpZExheW91dCk7CisgICAgICAgIG1DZWxsV2lkdGggPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5GaXhlZEdyaWRMYXlvdXRfY2VsbFdpZHRoLCAtMSk7CisgICAgICAgIG1DZWxsSGVpZ2h0ID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCisgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuRml4ZWRHcmlkTGF5b3V0X2NlbGxIZWlnaHQsIC0xKTsKKyAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2VsbFdpZHRoKGludCBweCkgeworICAgICAgICBtQ2VsbFdpZHRoID0gcHg7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsSGVpZ2h0KGludCBweCkgeworICAgICAgICBtQ2VsbEhlaWdodCA9IHB4OworICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgaW50IGNlbGxXaWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMobUNlbGxXaWR0aCwKKyAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5BVF9NT1NUKTsKKyAgICAgICAgaW50IGNlbGxIZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1DZWxsSGVpZ2h0LAorICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLkFUX01PU1QpOworCisgICAgICAgIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXg9MDsgaW5kZXg8Y291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGluZGV4KTsKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2VsbFdpZHRoU3BlYywgY2VsbEhlaWdodFNwZWMpOworICAgICAgICB9CisgICAgICAgIC8vIFVzZSB0aGUgc2l6ZSBvdXIgcGFyZW50cyBnYXZlIHVzCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHJlc29sdmVTaXplKG1DZWxsV2lkdGgqY291bnQsIHdpZHRoTWVhc3VyZVNwZWMpLAorICAgICAgICAgICAgICAgIHJlc29sdmVTaXplKG1DZWxsSGVpZ2h0KmNvdW50LCBoZWlnaHRNZWFzdXJlU3BlYykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKKyAgICAgICAgaW50IGNlbGxXaWR0aCA9IG1DZWxsV2lkdGg7CisgICAgICAgIGludCBjZWxsSGVpZ2h0ID0gbUNlbGxIZWlnaHQ7CisgICAgICAgIGludCBjb2x1bW5zID0gKHIgLSBsKSAvIGNlbGxXaWR0aDsKKyAgICAgICAgaWYgKGNvbHVtbnMgPCAwKSB7CisgICAgICAgICAgICBjb2x1bW5zID0gMTsKKyAgICAgICAgfQorICAgICAgICBpbnQgeCA9IDA7CisgICAgICAgIGludCB5ID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGZvciAoaW50IGluZGV4PTA7IGluZGV4PGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpbmRleCk7CisKKyAgICAgICAgICAgIGludCB3ID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgaW50IGggPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOworCisgICAgICAgICAgICBpbnQgbGVmdCA9IHggKyAoKGNlbGxXaWR0aC13KS8yKTsKKyAgICAgICAgICAgIGludCB0b3AgPSB5ICsgKChjZWxsSGVpZ2h0LWgpLzIpOworCisgICAgICAgICAgICBjaGlsZC5sYXlvdXQobGVmdCwgdG9wLCBsZWZ0K3csIHRvcCtoKTsKKyAgICAgICAgICAgIGlmIChpID49IChjb2x1bW5zLTEpKSB7CisgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgIHkgKz0gY2VsbEhlaWdodDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIHggKz0gY2VsbFdpZHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0ZpeGVkR3JpZExheW91dC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9maXhlZGdyaWRsYXlvdXQvRml4ZWRHcmlkTGF5b3V0VGVzdC5qYXZhIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvZml4ZWRncmlkbGF5b3V0L0ZpeGVkR3JpZExheW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM5ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9GaXhlZEdyaWRMYXlvdXQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvZml4ZWRncmlkbGF5b3V0L0ZpeGVkR3JpZExheW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDE5IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuZml4ZWRncmlkbGF5b3V0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBGaXhlZEdyaWRMYXlvdXRUZXN0IGV4dGVuZHMgQWN0aXZpdHkKK3sKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkKKyAgICB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm1haW4pOworCisgICAgICAgIEZpeGVkR3JpZExheW91dCBncmlkID0gKEZpeGVkR3JpZExheW91dClmaW5kVmlld0J5SWQoUi5pZC5ncmlkKTsKKyAgICAgICAgZ3JpZC5zZXRDZWxsV2lkdGgoODApOworICAgICAgICBncmlkLnNldENlbGxIZWlnaHQoODApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvSG9tZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ob21lL0hvbWUuamF2YSBiL3NhbXBsZXMvSG9tZS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ob21lL0hvbWUuamF2YQppbmRleCBjMjNmN2I4Li43Y2FlODdlIDEwMDY0NAotLS0gYS9zYW1wbGVzL0hvbWUvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvaG9tZS9Ib21lLmphdmEKKysrIGIvc2FtcGxlcy9Ib21lL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2hvbWUvSG9tZS5qYXZhCkBAIC0xMTAsNiArMTEwLDkgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBtQmxvY2tBbmltYXRpb247CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gbUhvbWVEb3duOworICAgIHByaXZhdGUgYm9vbGVhbiBtQmFja0Rvd247CisgICAgCiAgICAgcHJpdmF0ZSBWaWV3IG1TaG93QXBwbGljYXRpb25zOwogICAgIHByaXZhdGUgQ2hlY2tCb3ggbVNob3dBcHBsaWNhdGlvbnNDaGVjazsKIApAQCAtMzk2LDE5ICszOTksNDQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc0ZvY3VzKSB7CisgICAgICAgIHN1cGVyLm9uV2luZG93Rm9jdXNDaGFuZ2VkKGhhc0ZvY3VzKTsKKyAgICAgICAgaWYgKCFoYXNGb2N1cykgeworICAgICAgICAgICAgbUJhY2tEb3duID0gbUhvbWVEb3duID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChldmVudC5nZXRBY3Rpb24oKSA9PSBLZXlFdmVudC5BQ1RJT05fRE9XTikgewogICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKKyAgICAgICAgICAgICAgICAgICAgbUJhY2tEb3duID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0hPTUU6CisgICAgICAgICAgICAgICAgICAgIG1Ib21lRG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEFjdGlvbigpID09IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRLZXlDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfQkFDSzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIEJBQ0sgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUJhY2tEb3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFX0hPTUU6CisgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBIT01FIGJlaGF2aW9yLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Ib21lRG93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOwogICAgIH0KLQorICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsgYi9zaW11bGF0b3IvYXBwL0FuZHJvaWQubWsKaW5kZXggYzZlMWQxNC4uM2NlN2NkNSAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9BbmRyb2lkLm1rCisrKyBiL3NpbXVsYXRvci9hcHAvQW5kcm9pZC5tawpAQCAtMjQsMTIgKzI0LDE1IEBACiAJUGhvbmVDb2xsZWN0aW9uLmNwcCBcCiAJUGhvbmVEYXRhLmNwcCBcCiAJUGhvbmVXaW5kb3cuY3BwIFwKKwlQaXBlLmNwcCBcCiAJUHJlZmVyZW5jZXMuY3BwIFwKIAlQcmVmc0RpYWxvZy5jcHAgXAogCVByb3BlcnR5U2VydmVyLmNwcCBcCiAJU2VtYXBob3JlLmNwcCBcCiAJU2htZW0uY3BwIFwKLQlVc2VyRXZlbnQuY3BwCisJVXNlckV2ZW50LmNwcCBcCisJZXhlY3V0YWJsZXBhdGhfbGludXguY3BwIFwKKwlwb3J0ZWQuY3BwCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogCWxpYnRpbnl4bWwKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvTG9hZGFibGVJbWFnZS5jcHAgYi9zaW11bGF0b3IvYXBwL0xvYWRhYmxlSW1hZ2UuY3BwCmluZGV4IGU1YmQwZjMuLjUxMzE2NWIgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvTG9hZGFibGVJbWFnZS5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9Mb2FkYWJsZUltYWdlLmNwcApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgIkFzc2V0U3RyZWFtLmgiCiAjaW5jbHVkZSAiTXlBcHAuaCIKIAotI2luY2x1ZGUgPHV0aWxzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvTG9jYWxCaUNoYW5uZWwuaCBiL3NpbXVsYXRvci9hcHAvTG9jYWxCaUNoYW5uZWwuaAppbmRleCBjZTA0YmMwLi5hNGY0ZDYyIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL0xvY2FsQmlDaGFubmVsLmgKKysrIGIvc2ltdWxhdG9yL2FwcC9Mb2NhbEJpQ2hhbm5lbC5oCkBAIC0xMCw3ICsxMCw3IEBACiAjZXJyb3IgRE8gTk9UIFVTRSBUSElTIEZJTEUgSU4gVEhFIERFVklDRSBCVUlMRAogI2VuZGlmCiAKLSNpbmNsdWRlIDx1dGlscy9QaXBlLmg+CisjaW5jbHVkZSAiUGlwZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvTWVzc2FnZVN0cmVhbS5oIGIvc2ltdWxhdG9yL2FwcC9NZXNzYWdlU3RyZWFtLmgKaW5kZXggZGU5YzM5OC4uODJhOWI0YyAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9NZXNzYWdlU3RyZWFtLmgKKysrIGIvc2ltdWxhdG9yL2FwcC9NZXNzYWdlU3RyZWFtLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNlcnJvciBETyBOT1QgVVNFIFRISVMgRklMRSBJTiBUSEUgREVWSUNFIEJVSUxECiAjZW5kaWYKIAotI2luY2x1ZGUgPHV0aWxzL1BpcGUuaD4KKyNpbmNsdWRlICJQaXBlLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Vpby5oPgogCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL015QXBwLmNwcCBiL3NpbXVsYXRvci9hcHAvTXlBcHAuY3BwCmluZGV4IDMxM2U0NGQuLmZkNjEwYjEgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvTXlBcHAuY3BwCisrKyBiL3NpbXVsYXRvci9hcHAvTXlBcHAuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlICJNYWluRnJhbWUuaCIKICNpbmNsdWRlICJNeUFwcC5oIgotI2luY2x1ZGUgPHV0aWxzL2V4ZWN1dGFibGVwYXRoLmg+CisjaW5jbHVkZSAiZXhlY3V0YWJsZXBhdGguaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1Bob25lQ29sbGVjdGlvbi5jcHAgYi9zaW11bGF0b3IvYXBwL1Bob25lQ29sbGVjdGlvbi5jcHAKaW5kZXggNWNkZGZhOC4uZTE4ODJjYyAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9QaG9uZUNvbGxlY3Rpb24uY3BwCisrKyBiL3NpbXVsYXRvci9hcHAvUGhvbmVDb2xsZWN0aW9uLmNwcApAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgIlBob25lRGF0YS5oIgogI2luY2x1ZGUgIk15QXBwLmgiCiAKLSNpbmNsdWRlIDx1dGlscy5oPgorI2luY2x1ZGUgInV0aWxzLmgiCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmNwcCBiL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmNwcAppbmRleCA0ODYxNGZkLi5mMTVkZjJiIDEwMDY0NAotLS0gYS9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSAiUGhvbmVDb2xsZWN0aW9uLmgiCiAjaW5jbHVkZSAiTXlBcHAuaCIKIAotI2luY2x1ZGUgPHV0aWxzLmg+CisjaW5jbHVkZSAidXRpbHMuaCIKICNpbmNsdWRlIDx1dGlscy9Bc3NldE1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmggYi9zaW11bGF0b3IvYXBwL1Bob25lRGF0YS5oCmluZGV4IGM3ZjQ3MzIuLjJkNzAwM2EgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci9hcHAvUGhvbmVEYXRhLmgKKysrIGIvc2ltdWxhdG9yL2FwcC9QaG9uZURhdGEuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgIlBob25lQnV0dG9uLmgiCiAjaW5jbHVkZSAiTG9hZGFibGVJbWFnZS5oIgogI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgogCiAKIC8qCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1BpcGUuY3BwIGIvc2ltdWxhdG9yL2FwcC9QaXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNlNzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9QaXBlLmNwcApAQCAtMCwwICsxLDQ2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBVbmlkaXJlY3Rpb25hbCBwaXBlLgorLy8KKworI2luY2x1ZGUgIlBpcGUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGZjbnRsLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgdW5zaWduZWQgbG9uZyBrSW52YWxpZEhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKworCisvKgorICogQ29uc3RydWN0b3IuICBEbyBsaXR0bGUuCisgKi8KK1BpcGU6OlBpcGUodm9pZCkKKyAgICA6IG1SZWFkTm9uQmxvY2tpbmcoZmFsc2UpLCBtUmVhZEhhbmRsZShrSW52YWxpZEhhbmRsZSksCisgICAgICBtV3JpdGVIYW5kbGUoa0ludmFsaWRIYW5kbGUpCit7Cit9CisKKy8qCisgKiBEZXN0cnVjdG9yLiAgVXNlIHRoZSBzeXN0ZW0tYXBwcm9wcmlhdGUgY2xvc2UgY2FsbC4KKyAqLworUGlwZTo6flBpcGUodm9pZCkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIGlmIChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoIUNsb3NlSGFuZGxlKChIQU5ETEUpbVJlYWRIYW5kbGUpKQorICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyByZWFkIGhhbmRsZSAoJWxkKVxuIiwKKyAgICAgICAgICAgICAgICBtUmVhZEhhbmRsZSk7CisgICAgfQorICAgIGlmIChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgRmx1c2hGaWxlQnVmZmVycygoSEFORExFKW1Xcml0ZUhhbmRsZSk7CisgICAgICAgIGlmICghQ2xvc2VIYW5kbGUoKEhBTkRMRSltV3JpdGVIYW5kbGUpKQorICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyB3cml0ZSBoYW5kbGUgKCVsZClcbiIsCisgICAgICAgICAgICAgICAgbVdyaXRlSGFuZGxlKTsKKyAgICB9CisjZWxzZQorICAgIGlmIChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoY2xvc2UoKGludCkgbVJlYWRIYW5kbGUpICE9IDApCisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHJlYWQgZmQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAoaW50KSBtUmVhZEhhbmRsZSk7CisgICAgfQorICAgIGlmIChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKGNsb3NlKChpbnQpIG1Xcml0ZUhhbmRsZSkgIT0gMCkKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3Npbmcgd3JpdGUgZmQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAoaW50KSBtV3JpdGVIYW5kbGUpOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogQ3JlYXRlIHRoZSBwaXBlLgorICoKKyAqIFVzZSB0aGUgUE9TSVggc3R1ZmYgZm9yIGV2ZXJ5dGhpbmcgYnV0IFdpbmRvd3MuCisgKi8KK2Jvb2wgUGlwZTo6Y3JlYXRlKHZvaWQpCit7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKTsKKyAgICBhc3NlcnQobVdyaXRlSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgLyogd2UgdXNlIHRoaXMgYWNyb3NzIHByb2Nlc3Nlcywgc28gdGhleSBuZWVkIHRvIGJlIGluaGVyaXRhYmxlICovCisgICAgSEFORExFIGhhbmRsZXNbMl07CisgICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYUF0dHI7CisKKyAgICBzYUF0dHIubkxlbmd0aCA9IHNpemVvZihTRUNVUklUWV9BVFRSSUJVVEVTKTsKKyAgICBzYUF0dHIuYkluaGVyaXRIYW5kbGUgPSBUUlVFOworICAgIHNhQXR0ci5scFNlY3VyaXR5RGVzY3JpcHRvciA9IE5VTEw7CisKKyAgICBpZiAoIUNyZWF0ZVBpcGUoJmhhbmRsZXNbMF0sICZoYW5kbGVzWzFdLCAmc2FBdHRyLCAwKSkgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJ1bmFibGUgdG8gY3JlYXRlIHBpcGVcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1SZWFkSGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZXNbMF07CisgICAgbVdyaXRlSGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZXNbMV07CisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIGludCBmZHNbMl07CisKKyAgICBpZiAocGlwZShmZHMpICE9IDApIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAidW5hYmxlIHRvIGNyZWF0ZSBwaXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtUmVhZEhhbmRsZSA9IGZkc1swXTsKKyAgICBtV3JpdGVIYW5kbGUgPSBmZHNbMV07CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLyoKKyAqIENyZWF0ZSBhICJoYWxmIHBpcGUiLiAgUGxlYXNlLCBubyBTZWd3YXkgcmlkaW5nLgorICovCitib29sIFBpcGU6OmNyZWF0ZVJlYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKyAgICBtUmVhZEhhbmRsZSA9IGhhbmRsZTsKKyAgICBhc3NlcnQobVdyaXRlSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENyZWF0ZSBhICJoYWxmIHBpcGUiIGZvciB3cml0aW5nLgorICovCitib29sIFBpcGU6OmNyZWF0ZVdyaXRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKyAgICBtV3JpdGVIYW5kbGUgPSBoYW5kbGU7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFJldHVybiAidHJ1ZSIgaWYgY3JlYXRlKCkgaGFzIGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseS4KKyAqLworYm9vbCBQaXBlOjppc0NyZWF0ZWQodm9pZCkKK3sKKyAgICAvLyBvbmUgb3IgdGhlIG90aGVyIHNob3VsZCBiZSBvcGVuCisgICAgcmV0dXJuIChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSB8fCBtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworfQorCisKKy8qCisgKiBSZWFkIGRhdGEgZnJvbSB0aGUgcGlwZS4KKyAqCisgKiBGb3IgTGludXggYW5kIERhcndpbiwganVzdCBjYWxsIHJlYWQoKS4gIEZvciBXaW5kb3dzLCBpbXBsZW1lbnQKKyAqIG5vbi1ibG9ja2luZyByZWFkcyBieSBjYWxsaW5nIFBlZWtOYW1lZFBpcGUgZmlyc3QuCisgKi8KK2ludCBQaXBlOjpyZWFkKHZvaWQqIGJ1ZiwgaW50IGNvdW50KQoreworICAgIGFzc2VydChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIERXT1JEIHRvdGFsQnl0ZXNBdmFpbCA9IGNvdW50OworICAgIERXT1JEIGJ5dGVzUmVhZDsKKworICAgIGlmIChtUmVhZE5vbkJsb2NraW5nKSB7CisgICAgICAgIC8vIHVzZSBQZWVrTmFtZWRQaXBlIHRvIGFkanVzdCByZWFkIGNvdW50IGV4cGVjdGF0aW9ucworICAgICAgICBpZiAoIVBlZWtOYW1lZFBpcGUoKEhBTkRMRSkgbVJlYWRIYW5kbGUsIE5VTEwsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgJnRvdGFsQnl0ZXNBdmFpbCwgTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIExPRyhMT0dfRVJST1IsICJwaXBlIiwgIlBlZWtOYW1lZFBpcGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b3RhbEJ5dGVzQXZhaWwgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghUmVhZEZpbGUoKEhBTkRMRSkgbVJlYWRIYW5kbGUsIGJ1ZiwgdG90YWxCeXRlc0F2YWlsLCAmYnl0ZXNSZWFkLAorICAgICAgICAgICAgTlVMTCkpCisgICAgeworICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9IQU5ETEVfRU9GIHx8IGVyciA9PSBFUlJPUl9CUk9LRU5fUElQRSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJSZWFkRmlsZSBmYWlsZWQgKGVycj0lbGQpXG4iLCBlcnIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpIGJ5dGVzUmVhZDsKKyNlbHNlCisgICAgaW50IGNjOworICAgIGNjID0gOjpyZWFkKG1SZWFkSGFuZGxlLCBidWYsIGNvdW50KTsKKyAgICBpZiAoY2MgPCAwICYmIGVycm5vID09IEVBR0FJTikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNjOworI2VuZGlmCit9CisKKy8qCisgKiBXcml0ZSBkYXRhIHRvIHRoZSBwaXBlLgorICoKKyAqIFBPU0lYIHN5c3RlbXMgYXJlIHRyaXZpYWwsIFdpbmRvd3MgdXNlcyBhIGRpZmZlcmVudCBjYWxsIGFuZCBkb2Vzbid0CisgKiBoYW5kbGUgbm9uLWJsb2NraW5nIHdyaXRlcy4KKyAqCisgKiBJZiB3ZSBhZGQgbm9uLWJsb2NraW5nIHN1cHBvcnQgaGVyZSwgd2UgcHJvYmFibHkgd2FudCB0byBtYWtlIGl0IGFuCisgKiBhbGwtb3Itbm90aGluZyB3cml0ZS4KKyAqCisgKiBETyBOT1QgdXNlIExPRygpIGhlcmUsIHdlIGNvdWxkIGJlIHdyaXRpbmcgYSBsb2cgbWVzc2FnZS4KKyAqLworaW50IFBpcGU6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZiwgaW50IGNvdW50KQoreworICAgIGFzc2VydChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBEV09SRCBieXRlc1dyaXR0ZW47CisKKyAgICBpZiAobVdyaXRlTm9uQmxvY2tpbmcpIHsKKyAgICAgICAgLy8gQlVHOiBjYW4ndCB1c2UgUGVla05hbWVkUGlwZSgpIHRvIGdldCB0aGUgYW1vdW50IG9mIHNwYWNlCisgICAgICAgIC8vIGxlZnQuICBMb29rcyBsaWtlIHdlIG5lZWQgdG8gdXNlICJvdmVybGFwcGVkIEkvTyIgZnVuY3Rpb25zLgorICAgICAgICAvLyBJIGp1c3QgZG9uJ3QgY2FyZSB0aGF0IG11Y2guCisgICAgfQorCisgICAgaWYgKCFXcml0ZUZpbGUoKEhBTkRMRSkgbVdyaXRlSGFuZGxlLCBidWYsIGNvdW50LCAmYnl0ZXNXcml0dGVuLCBOVUxMKSkgeworICAgICAgICAvLyBjYW4ndCBMT0csIHVzZSBzdGRlcnIKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXcml0ZUZpbGUgZmFpbGVkIChlcnI9JWxkKVxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpIGJ5dGVzV3JpdHRlbjsKKyNlbHNlCisgICAgaW50IGNjOworICAgIGNjID0gOjp3cml0ZShtV3JpdGVIYW5kbGUsIGJ1ZiwgY291bnQpOworICAgIGlmIChjYyA8IDAgJiYgZXJybm8gPT0gRUFHQUlOKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY2M7CisjZW5kaWYKK30KKworLyoKKyAqIEZpZ3VyZSBvdXQgaWYgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgb24gdGhlIHJlYWQgZmQuCisgKgorICogV2UgcmV0dXJuICJ0cnVlIiBvbiBlcnJvciBiZWNhdXNlIHdlIHdhbnQgdGhlIGNhbGxlciB0byB0cnkgdG8gcmVhZAorICogZnJvbSB0aGUgcGlwZS4gIFRoZXknbGwgbm90aWNlIHRoZSByZWFkIGZhaWx1cmUgYW5kIGRvIHNvbWV0aGluZworICogYXBwcm9wcmlhdGUuCisgKi8KK2Jvb2wgUGlwZTo6cmVhZFJlYWR5KHZvaWQpCit7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgRFdPUkQgdG90YWxCeXRlc0F2YWlsOworCisgICAgaWYgKCFQZWVrTmFtZWRQaXBlKChIQU5ETEUpIG1SZWFkSGFuZGxlLCBOVUxMLCAwLCBOVUxMLAorICAgICAgICAgICAgJnRvdGFsQnl0ZXNBdmFpbCwgTlVMTCkpCisgICAgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJQZWVrTmFtZWRQaXBlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAodG90YWxCeXRlc0F2YWlsICE9IDApOworI2Vsc2UKKyAgICBlcnJubyA9IDA7CisgICAgZmRfc2V0IHJlYWRmZHM7CisgICAgc3RydWN0IHRpbWV2YWwgdHYgPSB7IDAsIDAgfTsKKyAgICBpbnQgY2M7CisKKyAgICBGRF9aRVJPKCZyZWFkZmRzKTsKKyAgICBGRF9TRVQobVJlYWRIYW5kbGUsICZyZWFkZmRzKTsKKworICAgIGNjID0gc2VsZWN0KG1SZWFkSGFuZGxlKzEsICZyZWFkZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgIGlmIChjYyA8IDApIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAic2VsZWN0KCkgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChjYyA9PSAwKSB7CisgICAgICAgIC8qIHRpbWVkIG91dCwgbm90aGluZyBhdmFpbGFibGUgKi8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoY2MgPT0gMSkgeworICAgICAgICAvKiBvdXIgZmQgaXMgcmVhZHkgKi8KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiSFVIPyBzZWxlY3QoKSByZXR1cm5lZCA+IDFcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisjZW5kaWYKK30KKworLyoKKyAqIEVuYWJsZSBvciBkaXNhYmxlIG5vbi1ibG9ja2luZyBtb2RlIGZvciB0aGUgcmVhZCBkZXNjcmlwdG9yLgorICoKKyAqIE5PVEU6IHRoZSBjYWxscyBzdWNjZWVkIHVuZGVyIE1hYyBPUyBYLCBidXQgdGhlIHBpcGUgZG9lc24ndCBhcHBlYXIgdG8KKyAqIGFjdHVhbGx5IGJlIGluIG5vbi1ibG9ja2luZyBtb2RlLiAgSWYgdGhpcyBtYXR0ZXJzIC0tIGkuZS4geW91J3JlIG5vdAorICogdXNpbmcgYSBzZWxlY3QoKSBjYWxsIC0tIHB1dCBhIGNhbGwgdG8gcmVhZFJlYWR5KCkgaW4gZnJvbnQgb2YgdGhlCisgKiA6OnJlYWQoKSBjYWxsLCB3aXRoIGEgUElQRV9OT05CTE9DS19CUk9LRU4gI2lmZGVmIGluIHRoZSBNYWtlZmlsZSBmb3IKKyAqIERhcndpbi4KKyAqLworYm9vbCBQaXBlOjpzZXRSZWFkTm9uQmxvY2tpbmcoYm9vbCB2YWwpCit7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgLy8gbm90aGluZyB0byBkbworI2Vsc2UKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBpZiAoZmNudGwobVJlYWRIYW5kbGUsIEZfR0VURkwsICZmbGFncykgPT0gLTEpIHsKKyAgICAgICAgTE9HKExPR19FUlJPUiwgInBpcGUiLCAiY291bGRuJ3QgZ2V0IGZsYWdzIGZvciBwaXBlIHJlYWQgZmRcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWwpCisgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgZWxzZQorICAgICAgICBmbGFncyAmPSB+KE9fTk9OQkxPQ0spOworICAgIGlmIChmY250bChtUmVhZEhhbmRsZSwgRl9TRVRGTCwgJmZsYWdzKSA9PSAtMSkgeworICAgICAgICBMT0coTE9HX0VSUk9SLCAicGlwZSIsICJjb3VsZG4ndCBzZXQgZmxhZ3MgZm9yIHBpcGUgcmVhZCBmZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworICAgIG1SZWFkTm9uQmxvY2tpbmcgPSB2YWw7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBFbmFibGUgb3IgZGlzYWJsZSBub24tYmxvY2tpbmcgbW9kZSBmb3IgdGhlIHdyaXRlIGRlc2NyaXB0b3IuCisgKgorICogQXMgd2l0aCBzZXRSZWFkTm9uQmxvY2tpbmcoKSwgdGhpcyBkb2VzIG5vdCB3b3JrIG9uIHRoZSBNYWMuCisgKi8KK2Jvb2wgUGlwZTo6c2V0V3JpdGVOb25CbG9ja2luZyhib29sIHZhbCkKK3sKKyAgICBhc3NlcnQobVdyaXRlSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworI2lmIGRlZmluZWQoSEFWRV9XSU4zMl9JUEMpCisgICAgLy8gbm90aGluZyB0byBkbworI2Vsc2UKKyAgICBpbnQgZmxhZ3M7CisKKyAgICBpZiAoZmNudGwobVdyaXRlSGFuZGxlLCBGX0dFVEZMLCAmZmxhZ3MpID09IC0xKSB7CisgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLAorICAgICAgICAgICAgIldhcm5pbmc6IGNvdWxkbid0IGdldCBmbGFncyBmb3IgcGlwZSB3cml0ZSBmZCAoZXJybm89JWQpXG4iLAorICAgICAgICAgICAgZXJybm8pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWwpCisgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgZWxzZQorICAgICAgICBmbGFncyAmPSB+KE9fTk9OQkxPQ0spOworICAgIGlmIChmY250bChtV3JpdGVIYW5kbGUsIEZfU0VURkwsICZmbGFncykgPT0gLTEpIHsKKyAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsCisgICAgICAgICAgICAiV2FybmluZzogY291bGRuJ3Qgc2V0IGZsYWdzIGZvciBwaXBlIHdyaXRlIGZkIChlcnJubz0lZClcbiIsCisgICAgICAgICAgICBlcnJubyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworICAgIG1Xcml0ZU5vbkJsb2NraW5nID0gdmFsOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogU3BlY2lmeSB3aGV0aGVyIGEgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSBpbmhlcml0ZWQgYnkgYSBjaGlsZCBwcm9jZXNzLgorICogVW5kZXIgTGludXggdGhpcyBtZWFucyBzZXR0aW5nIHRoZSBjbG9zZS1vbi1leGVjIGZsYWcsIHVuZGVyIFdpbmRvd3MKKyAqIHRoaXMgaXMgU2V0SGFuZGxlSW5mb3JtYXRpb24oSEFORExFX0ZMQUdfSU5IRVJJVCkuCisgKi8KK2Jvb2wgUGlwZTo6ZGlzYWxsb3dSZWFkSW5oZXJpdCh2b2lkKQoreworICAgIGlmIChtUmVhZEhhbmRsZSA9PSBrSW52YWxpZEhhbmRsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWYgZGVmaW5lZChIQVZFX1dJTjMyX0lQQykKKyAgICBpZiAoU2V0SGFuZGxlSW5mb3JtYXRpb24oKEhBTkRMRSkgbVJlYWRIYW5kbGUsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApID09IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgaWYgKGZjbnRsKChpbnQpIG1SZWFkSGFuZGxlLCBGX1NFVEZELCBGRF9DTE9FWEVDKSAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KK2Jvb2wgUGlwZTo6ZGlzYWxsb3dXcml0ZUluaGVyaXQodm9pZCkKK3sKKyAgICBpZiAobVdyaXRlSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIGlmIChTZXRIYW5kbGVJbmZvcm1hdGlvbigoSEFORExFKSBtV3JpdGVIYW5kbGUsIEhBTkRMRV9GTEFHX0lOSEVSSVQsIDApID09IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgaWYgKGZjbnRsKChpbnQpIG1Xcml0ZUhhbmRsZSwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgIT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDbG9zZSByZWFkIGRlc2NyaXB0b3IuCisgKi8KK2Jvb2wgUGlwZTo6Y2xvc2VSZWFkKHZvaWQpCit7CisgICAgaWYgKG1SZWFkSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIGlmIChtUmVhZEhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoIUNsb3NlSGFuZGxlKChIQU5ETEUpbVJlYWRIYW5kbGUpKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHJlYWQgaGFuZGxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgaWYgKG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKSB7CisgICAgICAgIGlmIChjbG9zZSgoaW50KSBtUmVhZEhhbmRsZSkgIT0gMCkgeworICAgICAgICAgICAgTE9HKExPR19XQVJOLCAicGlwZSIsICJmYWlsZWQgY2xvc2luZyByZWFkIGZkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIG1SZWFkSGFuZGxlID0ga0ludmFsaWRIYW5kbGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDbG9zZSB3cml0ZSBkZXNjcmlwdG9yLgorICovCitib29sIFBpcGU6OmNsb3NlV3JpdGUodm9pZCkKK3sKKyAgICBpZiAobVdyaXRlSGFuZGxlID09IGtJbnZhbGlkSGFuZGxlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQorICAgIGlmIChtV3JpdGVIYW5kbGUgIT0ga0ludmFsaWRIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFDbG9zZUhhbmRsZSgoSEFORExFKW1Xcml0ZUhhbmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhMT0dfV0FSTiwgInBpcGUiLCAiZmFpbGVkIGNsb3Npbmcgd3JpdGUgaGFuZGxlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgaWYgKG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSkgeworICAgICAgICBpZiAoY2xvc2UoKGludCkgbVdyaXRlSGFuZGxlKSAhPSAwKSB7CisgICAgICAgICAgICBMT0coTE9HX1dBUk4sICJwaXBlIiwgImZhaWxlZCBjbG9zaW5nIHdyaXRlIGZkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIG1Xcml0ZUhhbmRsZSA9IGtJbnZhbGlkSGFuZGxlOworICAgIHJldHVybiB0cnVlOworfQorCisvKgorICogR2V0IHRoZSByZWFkIGhhbmRsZS4KKyAqLwordW5zaWduZWQgbG9uZyBQaXBlOjpnZXRSZWFkSGFuZGxlKHZvaWQpCit7CisgICAgYXNzZXJ0KG1SZWFkSGFuZGxlICE9IGtJbnZhbGlkSGFuZGxlKTsKKworICAgIHJldHVybiBtUmVhZEhhbmRsZTsKK30KKworLyoKKyAqIEdldCB0aGUgd3JpdGUgaGFuZGxlLgorICovCit1bnNpZ25lZCBsb25nIFBpcGU6OmdldFdyaXRlSGFuZGxlKHZvaWQpCit7CisgICAgYXNzZXJ0KG1Xcml0ZUhhbmRsZSAhPSBrSW52YWxpZEhhbmRsZSk7CisKKyAgICByZXR1cm4gbVdyaXRlSGFuZGxlOworfQorCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL1BpcGUuaCBiL3NpbXVsYXRvci9hcHAvUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL1BpcGUuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBGSUZPIEkvTy4KKy8vCisjaWZuZGVmIF9MSUJTX1VUSUxTX1BJUEVfSAorI2RlZmluZSBfTElCU19VVElMU19QSVBFX0gKKworI2lmZGVmIEhBVkVfQU5EUk9JRF9PUworI2Vycm9yIERPIE5PVCBVU0UgVEhJUyBGSUxFIElOIFRIRSBERVZJQ0UgQlVJTEQKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiBTaW1wbGUgYW5vbnltb3VzIHVuaWRpcmVjdGlvbmFsIHBpcGUuCisgKgorICogVGhlIHByaW1hcnkgZ29hbCBpcyB0byBjcmVhdGUgYW4gaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbWFsIG92ZXJoZWFkCisgKiB1bmRlciBMaW51eC4gIE1ha2luZyBXaW5kb3dzLCBNYWMgT1MgWCwgYW5kIExpbnV4IGFsbCB3b3JrIHRoZSBzYW1lIHdheQorICogaXMgYSBzZWNvbmRhcnkgZ29hbC4gIFBhcnQgb2YgdGhpcyBnb2FsIGlzIHRvIGhhdmUgc29tZXRoaW5nIHRoYXQgY2FuCisgKiBiZSBmZWQgdG8gYSBzZWxlY3QoKSBjYWxsLCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gc2xlZXAgaW4gdGhlCisgKiBrZXJuZWwgdW50aWwgc29tZXRoaW5nIGludGVyZXN0aW5nIGhhcHBlbnMuCisgKi8KK2NsYXNzIFBpcGUgeworcHVibGljOgorICAgIFBpcGUodm9pZCk7CisgICAgdmlydHVhbCB+UGlwZSh2b2lkKTsKKworICAgIC8qIENyZWF0ZSB0aGUgcGlwZSAqLworICAgIGJvb2wgY3JlYXRlKHZvaWQpOworCisgICAgLyogQ3JlYXRlIGEgcmVhZC1vbmx5IHBpcGUsIHVzaW5nIHRoZSBzdXBwbGllZCBoYW5kbGUgYXMgcmVhZCBoYW5kbGUgKi8KKyAgICBib29sIGNyZWF0ZVJlYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSk7CisgICAgLyogQ3JlYXRlIGEgd3JpdGUtb25seSBwaXBlLCB1c2luZyB0aGUgc3VwcGxpZWQgaGFuZGxlIGFzIHdyaXRlIGhhbmRsZSAqLworICAgIGJvb2wgY3JlYXRlV3JpdGVyKHVuc2lnbmVkIGxvbmcgaGFuZGxlKTsKKworICAgIC8qIElzIHRoaXMgb2JqZWN0IHJlYWR5IHRvIGdvPyAqLworICAgIGJvb2wgaXNDcmVhdGVkKHZvaWQpOworCisgICAgLyoKKyAgICAgKiBSZWFkICJjb3VudCIgYnl0ZXMgZnJvbSB0aGUgcGlwZS4gIFJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHJlYWQsCisgICAgICogb3IgMCBpZiBubyBkYXRhIGF2YWlsYWJsZSBhbmQgd2UncmUgbm9uLWJsb2NraW5nLgorICAgICAqIFJldHVybnMgLTEgb24gZXJyb3IuCisgICAgICovCisgICAgaW50IHJlYWQodm9pZCogYnVmLCBpbnQgY291bnQpOworCisgICAgLyoKKyAgICAgKiBXcml0ZSAiY291bnQiIGJ5dGVzIGludG8gdGhlIHBpcGUuICBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuLAorICAgICAqIG9yIDAgaWYgdGhlcmUncyBubyByb29tIGZvciBtb3JlIGRhdGEgYW5kIHdlJ3JlIG5vbi1ibG9ja2luZy4KKyAgICAgKiBSZXR1cm5zIC0xIG9uIGVycm9yLgorICAgICAqLworICAgIGludCB3cml0ZShjb25zdCB2b2lkKiBidWYsIGludCBjb3VudCk7CisKKyAgICAvKiBSZXR1cm5zICJ0cnVlIiBpZiBkYXRhIGlzIGF2YWlsYWJsZSB0byByZWFkICovCisgICAgYm9vbCByZWFkUmVhZHkodm9pZCk7CisKKyAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBub24tYmxvY2tpbmcgSS9PIGZvciByZWFkcyAqLworICAgIGJvb2wgc2V0UmVhZE5vbkJsb2NraW5nKGJvb2wgdmFsKTsKKyAgICAvKiBFbmFibGUgb3IgZGlzYWJsZSBub24tYmxvY2tpbmcgSS9PIGZvciB3cml0ZXMuICBPbmx5IHdvcmtzIG9uIExpbnV4LiAqLworICAgIGJvb2wgc2V0V3JpdGVOb25CbG9ja2luZyhib29sIHZhbCk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgaGFuZGxlLiAgT25seSB1c2VmdWwgaW4gc29tZSBwbGF0Zm9ybS1zcGVjaWZpYyBzaXR1YXRpb25zLgorICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgZ2V0UmVhZEhhbmRsZSh2b2lkKTsKKyAgICB1bnNpZ25lZCBsb25nIGdldFdyaXRlSGFuZGxlKHZvaWQpOworCisgICAgLyoKKyAgICAgKiBNb2RpZnkgaW5oZXJpdGFuY2UsIGkuZS4gd2hldGhlciBvciBub3QgYSBjaGlsZCBwcm9jZXNzIHdpbGwgZ2V0CisgICAgICogY29waWVzIG9mIHRoZSBkZXNjcmlwdG9ycy4gIFN5c3RlbXMgd2l0aCBmb3JrK2V4ZWMgYWxsb3cgdXMgdG8gY2xvc2UKKyAgICAgKiB0aGUgZGVzY3JpcHRvcnMgYmVmb3JlIGxhdW5jaGluZyB0aGUgY2hpbGQgcHJvY2VzcywgYnV0IFdpbjMyCisgICAgICogZG9lc24ndCBhbGxvdyBpdC4KKyAgICAgKi8KKyAgICBib29sIGRpc2FsbG93UmVhZEluaGVyaXQodm9pZCk7CisgICAgYm9vbCBkaXNhbGxvd1dyaXRlSW5oZXJpdCh2b2lkKTsKKworICAgIC8qCisgICAgICogQ2xvc2Ugb25lIHNpZGUgb3IgdGhlIG90aGVyLiAgVXNlZnVsIGluIHRoZSBwYXJlbnQgYWZ0ZXIgbGF1bmNoaW5nCisgICAgICogYSBjaGlsZCBwcm9jZXNzLgorICAgICAqLworICAgIGJvb2wgY2xvc2VSZWFkKHZvaWQpOworICAgIGJvb2wgY2xvc2VXcml0ZSh2b2lkKTsKKworcHJpdmF0ZToKKyAgICBib29sICAgIG1SZWFkTm9uQmxvY2tpbmc7CisgICAgYm9vbCAgICBtV3JpdGVOb25CbG9ja2luZzsKKworICAgIHVuc2lnbmVkIGxvbmcgbVJlYWRIYW5kbGU7CisgICAgdW5zaWduZWQgbG9uZyBtV3JpdGVIYW5kbGU7Cit9OworCit9OyAvLyBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTElCU19VVElMU19QSVBFX0gKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvVXNlckV2ZW50TWVzc2FnZS5oIGIvc2ltdWxhdG9yL2FwcC9Vc2VyRXZlbnRNZXNzYWdlLmgKaW5kZXggNGE2NmNjMi4uOWI5NGVhNyAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9Vc2VyRXZlbnRNZXNzYWdlLmgKKysrIGIvc2ltdWxhdG9yL2FwcC9Vc2VyRXZlbnRNZXNzYWdlLmgKQEAgLTYsNyArNiw3IEBACiAjaWZuZGVmIF9TSU1fVVNFUl9FVkVOVF9NRVNTQUdFX0gKICNkZWZpbmUgX1NJTV9VU0VSX0VWRU5UX01FU1NBR0VfSAogCi0jaW5jbHVkZSA8dXRpbHMuaD4KKyNpbmNsdWRlICJ1dGlscy5oIgogI2luY2x1ZGUgIkxvZ01lc3NhZ2UuaCIKIAogLyoKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGguaCBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk5ODJkCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9TSU1fRVhFQ1VUQUJMRVBBVEhfSAorI2RlZmluZSBfU0lNX0VYRUNVVEFCTEVQQVRIX0gKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvLyByZXR1cm5zIHRoZSBwYXRoIHRvIHRoaXMgZXhlY3V0YWJsZQorI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK3ZvaWQgZXhlY3V0YWJsZXBhdGgoY2hhciBzW1BBVEhfTUFYXSk7CisKKyNlbmRpZiAvLyBfU0lNX0VYRUNVVEFCTEVQQVRIX0gKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfZGFyd2luLmNwcCBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfZGFyd2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMxYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC9leGVjdXRhYmxlcGF0aF9kYXJ3aW4uY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXhlY3V0YWJsZXBhdGguaCIKKyNpbXBvcnQgPENhcmJvbi9DYXJib24uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordm9pZCBleGVjdXRhYmxlcGF0aChjaGFyIHNbUEFUSF9NQVhdKQoreworICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIgcHNuOworICAgIEdldEN1cnJlbnRQcm9jZXNzKCZwc24pOworICAgIENGRGljdGlvbmFyeVJlZiBkaWN0OworICAgIGRpY3QgPSBQcm9jZXNzSW5mb3JtYXRpb25Db3B5RGljdGlvbmFyeSgmcHNuLCAweGZmZmZmZmZmKTsKKyAgICBDRlN0cmluZ1JlZiB2YWx1ZSA9IChDRlN0cmluZ1JlZilDRkRpY3Rpb25hcnlHZXRWYWx1ZShkaWN0LAorICAgICAgICAgICAgICAgIENGU1RSKCJDRkJ1bmRsZUV4ZWN1dGFibGUiKSk7CisgICAgQ0ZTdHJpbmdHZXRDU3RyaW5nKHZhbHVlLCBzLCBQQVRIX01BWCsxLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworfQorCmRpZmYgLS1naXQgYS9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2xpbnV4LmNwcCBiL3NpbXVsYXRvci9hcHAvZXhlY3V0YWJsZXBhdGhfbGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTNhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL2V4ZWN1dGFibGVwYXRoX2xpbnV4LmNwcApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4ZWN1dGFibGVwYXRoLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordm9pZCBleGVjdXRhYmxlcGF0aChjaGFyIGV4ZVtQQVRIX01BWF0pCit7CisgICAgY2hhciBwcm9jWzEwMF07CisgICAgc3ByaW50Zihwcm9jLCAiL3Byb2MvJWQvZXhlIiwgZ2V0cGlkKCkpOworICAgIAorICAgIGludCBlcnIgPSByZWFkbGluayhwcm9jLCBleGUsIFBBVEhfTUFYKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuY3BwIGIvc2ltdWxhdG9yL2FwcC9wb3J0ZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmIzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL3BvcnRlZC5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gUG9ydHMgb2Ygc3RhbmRhcmQgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhpc3Qgb24gYSBzcGVjaWZpYyBwbGF0Zm9ybS4KKy8vCisvLyBOb3RlIHRoZXNlIGFyZSBOT1QgaW4gdGhlICJhbmRyb2lkIiBuYW1lc3BhY2UuCisvLworI2luY2x1ZGUgInBvcnRlZC5oIgorCisjaWYgZGVmaW5lZChORUVEX0dFVFRJTUVPRkRBWSkgfHwgZGVmaW5lZChORUVEX1VTTEVFUCkKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoTkVFRF9HRVRUSU1FT0ZEQVkpCisvKgorICogUmVwbGFjZW1lbnQgZ2V0dGltZW9mZGF5KCkgZm9yIFdpbmRvd3MgZW52aXJvbm1lbnRzIChwcmltYXJpbHkgTWluR1cpLgorICoKKyAqIElnbm9yZXMgInR6Ii4KKyAqLworaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogcHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KQoreworICAgIGxvbmcgbG9uZyBuc1RpbWU7ICAgLy8gdGltZSBpbiAxMDBucyB1bml0cyBzaW5jZSBKYW4gMSAxNjAxCisgICAgRklMRVRJTUUgZnQ7CisKKyAgICBpZiAodHogIT0gTlVMTCkgeworICAgICAgICAvLyBvaCB3ZWxsCisgICAgfQorCisgICAgOjpHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOworICAgIG5zVGltZSA9IChsb25nIGxvbmcpIGZ0LmR3SGlnaERhdGVUaW1lIDw8IDMyIHwKKyAgICAgICAgICAgICAobG9uZyBsb25nKSBmdC5kd0xvd0RhdGVUaW1lOworICAgIC8vIGNvbnZlcnQgdG8gdGltZSBpbiB1c2VjIHNpbmNlIEphbiAxIDE5NzAKKyAgICBwdHYtPnR2X3VzZWMgPSAobG9uZykgKChuc1RpbWUgLyAxMExMKSAlIDEwMDAwMDBMTCk7CisgICAgcHR2LT50dl9zZWMgPSAobG9uZykgKChuc1RpbWUgLSAxMTY0NDQ3MzYwMDAwMDAwMDBMTCkgLyAxMDAwMDAwMExMKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE5FRURfVVNMRUVQKQorLy8KKy8vIFJlcGxhY2VtZW50IHVzbGVlcCBmb3IgV2luZG93cyBlbnZpcm9ubWVudHMgKHByaW1hcmlseSBNaW5HVykuCisvLwordm9pZCB1c2xlZXAodW5zaWduZWQgbG9uZyB1c2VjKQoreworICAgIC8vIFdpbjMyIEFQSSBmdW5jdGlvbiBTbGVlcCgpIHRha2VzIG1pbGxpc2Vjb25kcworICAgIDo6U2xlZXAoKHVzZWMgKyA1MDApIC8gMTAwMCk7Cit9CisjZW5kaWYKKworI2lmIDAgLy9kZWZpbmVkKE5FRURfUElQRSkKKy8vCisvLyBSZXBsYWNlbWVudCBwaXBlKCkgY29tbWFuZCBmb3IgTWluR1cKKy8vCisvLyBUaGUgX09fTk9JTkhFUklUIGZsYWcgc2V0cyBiSW5oZXJpdEhhbmRsZSB0byBGQUxTRSBpbiB0aGUKKy8vIFNlY3VyaXR5QXR0cmlidXRlcyBhcmd1bWVudCB0byBDcmVhdGVQaXBlKCkuICBUaGlzIG1lYW5zIHRoZSBoYW5kbGVzCisvLyBhcmVuJ3QgaW5oZXJpdGVkIHdoZW4gYSBuZXcgcHJvY2VzcyBpcyBjcmVhdGVkLiAgVGhlIGV4YW1wbGVzIEkndmUgc2VlbgorLy8gdXNlIGl0LCBwb3NzaWJseSBiZWNhdXNlIHRoZXJlJ3MgYSBsb3Qgb2YganVuayBnb2luZyBvbiBiZWhpbmQgdGhlCisvLyBzY2VuZXMuICAoSSdtIGFzc3VtaW5nICJwcm9jZXNzIiBhbmQgInRocmVhZCIgYXJlIGRpZmZlcmVudCBoZXJlLCBzbworLy8gd2Ugc2hvdWxkIGJlIG9rYXkgc3Bpbm5pbmcgdXAgYSB0aHJlYWQuKSAgVGhlIHJlY29tbWVuZGVkIHByYWN0aWNlIGlzCisvLyB0byBkdXAoKSB0aGUgZGVzY3JpcHRvciB5b3Ugd2FudCB0aGUgY2hpbGQgdG8gaGF2ZS4KKy8vCisvLyBJdCBhcHBlYXJzIHRoYXQgdW5uYW1lZCBwaXBlcyBjYW4ndCBkbyBub24tYmxvY2tpbmcgKCJvdmVybGFwcGVkIikgSS9PLgorLy8gWW91IGNhbid0IHVzZSBzZWxlY3QoKSBlaXRoZXIsIHNpbmNlIHRoYXQgb25seSB3b3JrcyBvbiBzb2NrZXRzLiAgVGhlCisvLyBXaW5kb3dzIEFQSSBjYWxscyB0aGF0IGFyZSB1c2VmdWwgaGVyZSBhbGwgb3BlcmF0ZSBvbiBhIEhBTkRMRSwgbm90CisvLyBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciwgYW5kIEkgZG9uJ3QgdGhpbmsgeW91IGNhbiBnZXQgdGhlcmUgZnJvbQorLy8gaGVyZS4gIFRoZSAibmFtZWQgcGlwZSIgc3R1ZmYgaXMgaW5zYW5lLgorLy8KK2ludCBwaXBlKGludCBmaWxlZGVzWzJdKQoreworICAgIHJldHVybiBfcGlwZShmaWxlZGVzLCAwLCBfT19CSU5BUlkgfCBfT19OT0lOSEVSSVQpOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE5FRURfU0VURU5WKQorLyoKKyAqIE1pbkdXIGxhY2tzIHRoZXNlLiAgRm9yIG5vdywganVzdCBzdHViIHRoZW0gb3V0IHNvIHRoZSBjb2RlIGNvbXBpbGVzLgorICovCitpbnQgc2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBpbnQgb3ZlcndyaXRlKQoreworICAgIHJldHVybiAwOworfQordm9pZCB1bnNldGVudihjb25zdCBjaGFyKiBuYW1lKQoreworfQorY2hhciogZ2V0ZW52KGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvcG9ydGVkLmggYi9zaW11bGF0b3IvYXBwL3BvcnRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2JlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3IvYXBwL3BvcnRlZC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gU3RhbmRhcmQgZnVuY3Rpb25zIHBvcnRlZCB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIE5vdGUgdGhlc2UgYXJlIE5PVAorLy8gaW4gdGhlICJhbmRyb2lkIiBuYW1lc3BhY2UuCisvLworI2lmbmRlZiBfTElCU19VVElMU19QT1JURURfSAorI2RlZmluZSBfTElCU19VVElMU19QT1JURURfSAorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4gICAgICAgLy8gZm9yIHRpbWV2YWwKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBsaWJyYXJ5IHJlcGxhY2VtZW50IGZ1bmN0aW9ucyAqLworI2lmIGRlZmluZWQoTkVFRF9HRVRUSU1FT0ZEQVkpCitpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE5FRURfVVNMRUVQKQordm9pZCB1c2xlZXAodW5zaWduZWQgbG9uZyB1c2VjKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoTkVFRF9QSVBFKQoraW50IHBpcGUoaW50IGZpbGVkZXNbMl0pOworI2VuZGlmCisjaWYgZGVmaW5lZChORUVEX1NFVEVOVikKK2ludCBzZXRlbnYoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGludCBvdmVyd3JpdGUpOwordm9pZCB1bnNldGVudihjb25zdCBjaGFyKiBuYW1lKTsKK2NoYXIqIGdldGVudihjb25zdCBjaGFyKiBuYW1lKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX0xJQlNfVVRJTFNfUE9SVEVEX0gKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvdXRpbHMuaCBiL3NpbXVsYXRvci9hcHAvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQ4NDVmCi0tLSAvZGV2L251bGwKKysrIGIvc2ltdWxhdG9yL2FwcC91dGlscy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gSGFuZHkgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIHBvcnRhYmlsaXR5IGNvZGUuICBUaGlzIGZpbGUgaW5jbHVkZXMgYWxsCisvLyBvZiB0aGUgZ2VuZXJhbGx5LXVzZWZ1bCBoZWFkZXJzIGluIHRoZSAidXRpbHMiIGRpcmVjdG9yeS4KKy8vCisjaWZuZGVmIF9TSU1fVVRJTFNfSAorI2RlZmluZSBfU0lNX1VUSUxTX0gKKworI2luY2x1ZGUgInBvcnRlZC5oIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nQXJyYXkuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNlbmRpZiAvLyBfU0lNX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0FuZHJvaWQubWsgYi9zaW11bGF0b3Ivd3JhcHNpbS9BbmRyb2lkLm1rCmluZGV4IDBiNzg5MGQuLmY5YTI0MTQgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0FuZHJvaWQubWsKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vQW5kcm9pZC5tawpAQCAtMyw3ICszLDYgQEAKICMKICMgQnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBzaW11bGF0b3IgTERfUFJFTE9BRCB3cmFwcGVyLgogIwotaWZuZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKIGlmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCkBAIC0yMyw3ICsyMiw4IEBACiAJSW50ZXJjZXB0LmMgXAogCUxvZy5jIFwKIAlTaW1NZ3IuYyBcCi0JU3lzUG93ZXIuYworCVN5c1Bvd2VyLmMgXAorCVV0aWwuYwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IHByZWJ1aWx0L2NvbW1vbi9lc2QKIApAQCAtNTUsNSArNTUsMyBAQAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKIGVuZGlmICMgaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQotZW5kaWYKLSMgaWZuZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKZGlmZiAtLWdpdCBhL3NpbXVsYXRvci93cmFwc2ltL0NvbW1vbi5oIGIvc2ltdWxhdG9yL3dyYXBzaW0vQ29tbW9uLmgKaW5kZXggYTljM2JiOC4uNDYzMjYyZiAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vQ29tbW9uLmgKKysrIGIvc2ltdWxhdG9yL3dyYXBzaW0vQ29tbW9uLmgKQEAgLTE0LDUgKzE0LDYgQEAKICNpbmNsdWRlICJMb2cuaCIKICNpbmNsdWRlICJTaW1NZ3IuaCIKICNpbmNsdWRlICJHbG9iYWxzLmgiCisjaW5jbHVkZSAiVXRpbC5oIgogCiAjZW5kaWYgLypfV1JBUFNJTV9DT01NT05fSCovCmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9EZXZGYi5jIGIvc2ltdWxhdG9yL3dyYXBzaW0vRGV2RmIuYwppbmRleCBjNTQ0MDNlLi5iZmRiYjIyIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9EZXZGYi5jCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0RldkZiLmMKQEAgLTE0LDYgKzE0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgRmJTdGF0ZSB7CisKKyAgICAvKiByZWZjb3VudCBmb3IgZHVwKCkgKi8KKyAgICBpbnQgcmVmQ291bnQ7CisKICAgICAvKiBpbmRleCBpbnRvIGdXcmFwU2ltLmRpc3BsYXlbXSAqLwogICAgIGludCAgICAgZGlzcGxheUlkeDsKIApAQCAtNzcsNyArODEsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgZnJlZVN0YXRlKEZiU3RhdGUqIGZiU3RhdGUpCiB7Ci0gICAgZnJlZShmYlN0YXRlKTsKKyAgICBpbnQgb2xkY291bnQ7CisKKyAgICBvbGRjb3VudCA9IHdzQXRvbWljQWRkKCZmYlN0YXRlLT5yZWZDb3VudCwgLTEpOworCisgICAgaWYgKG9sZGNvdW50ID09IDApIHsKKyAgICAgICAgZnJlZShmYlN0YXRlKTsKKyAgICB9CiB9CiAKIC8qCkBAIC0yNDIsNiArMjUyLDI4IEBACiB9CiAKIC8qCisgKiBkdXAoKSBhbiBleGlzdGluZyBmYWtlIGRlc2NyaXB0b3IKKyAqLworc3RhdGljIEZha2VEZXYqIGR1cEZiKEZha2VEZXYqIGRldiwgaW50IGZkKQoreworICAgIEZha2VEZXYqIG5ld0RldiA9IHdzQ3JlYXRlRmFrZURldihkZXYtPmRlYnVnTmFtZSk7CisgICAgaWYgKG5ld0RldiAhPSBOVUxMKSB7CisgICAgICAgIG5ld0Rldi0+bW1hcCA9IG1tYXBGYjsKKyAgICAgICAgbmV3RGV2LT5pb2N0bCA9IGlvY3RsRmI7CisgICAgICAgIG5ld0Rldi0+Y2xvc2UgPSBjbG9zZUZiOworICAgICAgICBuZXdEZXYtPmR1cCA9IGR1cEZiOworCisgICAgICAgIC8qIHVzZSBzdGF0ZSBmcm9tIGV4aXN0aW5nIEZha2VEZXYgKi8KKyAgICAgICAgRmJTdGF0ZSogZmJTdGF0ZSA9IGRldi0+c3RhdGU7CisgICAgICAgIHdzQXRvbWljQWRkKCZmYlN0YXRlLT5yZWZDb3VudCwgMSk7CisKKyAgICAgICAgbmV3RGV2LT5zdGF0ZSA9IGZiU3RhdGU7CisgICAgfQorCisgICAgcmV0dXJuIG5ld0RldjsKK30KKworLyoKICAqIE9wZW4gdGhlIGNvbnNvbGUgVFRZIGRldmljZSwgd2hpY2ggcmVzcG9uZHMgdG8gYSBjb2xsZWN0aW9uIG9mIGlvY3RsKClzLgogICovCiBGYWtlRGV2KiB3c09wZW5EZXZGYihjb25zdCBjaGFyKiBwYXRoTmFtZSwgaW50IGZsYWdzKQpAQCAtMjUxLDYgKzI4Myw3IEBACiAgICAgICAgIG5ld0Rldi0+bW1hcCA9IG1tYXBGYjsKICAgICAgICAgbmV3RGV2LT5pb2N0bCA9IGlvY3RsRmI7CiAgICAgICAgIG5ld0Rldi0+Y2xvc2UgPSBjbG9zZUZiOworICAgICAgICBuZXdEZXYtPmR1cCA9IGR1cEZiOwogCiAgICAgICAgIEZiU3RhdGUqIGZiU3RhdGUgPSBjYWxsb2MoMSwgc2l6ZW9mKEZiU3RhdGUpKTsKIApkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5jIGIvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5jCmluZGV4IDdkMjQ5NGUuLmYwM2RkMjkgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuYworKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmMKQEAgLTk5LDYgKzk5LDExIEBACiB7CiAgICAgcmV0dXJuIDA7CiB9CitzdGF0aWMgRmFrZURldiogbm9EdXAoRmFrZURldiogZGV2LCAuLi4pCit7CisgICAgbm90SW1wbGVtZW50ZWQoZGV2LCAiZHVwIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CiBzdGF0aWMgaW50IG5vUmVhZChGYWtlRGV2KiBkZXYsIC4uLikKIHsKICAgICByZXR1cm4gbm90SW1wbGVtZW50ZWQoZGV2LCAicmVhZCIpOwpAQCAtMTQ2LDYgKzE1MSw3IEBACiAgICAgbmV3RGV2LT5zdGF0ZSA9IE5VTEw7CiAKICAgICBuZXdEZXYtPmNsb3NlID0gKEZha2VfY2xvc2UpIG5vQ2xvc2U7CisgICAgbmV3RGV2LT5kdXAgPSAoRmFrZV9kdXApIG5vRHVwOwogICAgIG5ld0Rldi0+cmVhZCA9IChGYWtlX3JlYWQpIG5vUmVhZDsKICAgICBuZXdEZXYtPnJlYWR2ID0gKEZha2VfcmVhZHYpIG5vUmVhZHY7CiAgICAgbmV3RGV2LT53cml0ZSA9IChGYWtlX3dyaXRlKSBub1dyaXRlOwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5oIGIvc2ltdWxhdG9yL3dyYXBzaW0vRmFrZURldi5oCmluZGV4IDQ3ODFjZmMuLjY1ZjQ3YWUgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0Zha2VEZXYuaAorKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9GYWtlRGV2LmgKQEAgLTEyLDEzICsxMiwxNCBAQAogCiB0eXBlZGVmIHN0cnVjdCBGYWtlRGV2IEZha2VEZXY7CiAKLXR5cGVkZWYgaW50ICAgICAoKkZha2VfY2xvc2UpKEZha2VEZXYqIGRldiwgaW50KTsKLXR5cGVkZWYgc3NpemVfdCAoKkZha2VfcmVhZCkoRmFrZURldiogZGV2LCBpbnQsIHZvaWQqLCBzaXplX3QpOwotdHlwZWRlZiBzc2l6ZV90ICgqRmFrZV9yZWFkdikoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyosIGludCk7Ci10eXBlZGVmIHNzaXplX3QgKCpGYWtlX3dyaXRlKShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgdm9pZCosIHNpemVfdCk7Ci10eXBlZGVmIHNzaXplX3QgKCpGYWtlX3dyaXRldikoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyosIGludCk7Ci10eXBlZGVmIHZvaWQqICAgKCpGYWtlX21tYXApKEZha2VEZXYqIGRldiwgdm9pZCosIHNpemVfdCwgaW50LCBpbnQsIGludCwgX19vZmZfdCk7Ci10eXBlZGVmIGludCAgICAgKCpGYWtlX2lvY3RsKShGYWtlRGV2KiBkZXYsIGludCwgaW50LCB2b2lkKik7Cit0eXBlZGVmIGludCAgICAgICgqRmFrZV9jbG9zZSkoRmFrZURldiogZGV2LCBpbnQpOwordHlwZWRlZiBGYWtlRGV2KiAoKkZha2VfZHVwKShGYWtlRGV2KiBkZXYsIGludCk7Cit0eXBlZGVmIHNzaXplX3QgICgqRmFrZV9yZWFkKShGYWtlRGV2KiBkZXYsIGludCwgdm9pZCosIHNpemVfdCk7Cit0eXBlZGVmIHNzaXplX3QgICgqRmFrZV9yZWFkdikoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHN0cnVjdCBpb3ZlYyosIGludCk7Cit0eXBlZGVmIHNzaXplX3QgICgqRmFrZV93cml0ZSkoRmFrZURldiogZGV2LCBpbnQsIGNvbnN0IHZvaWQqLCBzaXplX3QpOwordHlwZWRlZiBzc2l6ZV90ICAoKkZha2Vfd3JpdGV2KShGYWtlRGV2KiBkZXYsIGludCwgY29uc3Qgc3RydWN0IGlvdmVjKiwgaW50KTsKK3R5cGVkZWYgdm9pZCogICAgKCpGYWtlX21tYXApKEZha2VEZXYqIGRldiwgdm9pZCosIHNpemVfdCwgaW50LCBpbnQsIGludCwgX19vZmZfdCk7Cit0eXBlZGVmIGludCAgICAgICgqRmFrZV9pb2N0bCkoRmFrZURldiogZGV2LCBpbnQsIGludCwgdm9pZCopOwogCiAvKgogICogQW4gb3BlbiBmYWtlIGRldmljZSBlbnRyeS4KQEAgLTQyLDYgKzQzLDcgQEAKICAgICAgKiBBbGwgb3RoZXIgZmlsZSBkZXNjcmlwdG9yIG9wZXJhdGlvbnMgc2hvdWxkIGZhaWwsIHVzdWFsbHkgd2l0aCBFQkFERi4KICAgICAgKi8KICAgICBGYWtlX2Nsb3NlICBjbG9zZTsKKyAgICBGYWtlX2R1cCAgZHVwOwogICAgIEZha2VfcmVhZCAgIHJlYWQ7CiAgICAgRmFrZV9yZWFkdiAgcmVhZHY7CiAgICAgRmFrZV93cml0ZSAgd3JpdGU7CmRpZmYgLS1naXQgYS9zaW11bGF0b3Ivd3JhcHNpbS9HbG9iYWxzLmggYi9zaW11bGF0b3Ivd3JhcHNpbS9HbG9iYWxzLmgKaW5kZXggNzVjOThkOC4uYThkODM0YyAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL3dyYXBzaW0vR2xvYmFscy5oCisrKyBiL3NpbXVsYXRvci93cmFwc2ltL0dsb2JhbHMuaApAQCAtMjksNiArMjksNyBAQAogdHlwZWRlZiBpbnQgICAgICgqRnVuY19vcGVuNjQpKGNvbnN0IGNoYXIqLCBpbnQsIG1vZGVfdCk7CiAKIHR5cGVkZWYgaW50ICAgICAoKkZ1bmNfY2xvc2UpKGludCk7Cit0eXBlZGVmIGludCAgICAgKCpGdW5jX2R1cCkoaW50KTsKIHR5cGVkZWYgc3NpemVfdCAoKkZ1bmNfcmVhZCkoaW50LCB2b2lkKiwgc2l6ZV90KTsKIHR5cGVkZWYgc3NpemVfdCAoKkZ1bmNfcmVhZHYpKGludCwgY29uc3Qgc3RydWN0IGlvdmVjKiwgaW50KTsKIHR5cGVkZWYgc3NpemVfdCAoKkZ1bmNfd3JpdGUpKGludCwgY29uc3Qgdm9pZCosIHNpemVfdCk7CkBAIC05NSw2ICs5Niw3IEBACiBFWFRFUk5fRlVOQyBGdW5jX29wZW42NCBfd3Nfb3BlbjY0OwogCiBFWFRFUk5fRlVOQyBGdW5jX2Nsb3NlIF93c19jbG9zZTsKK0VYVEVSTl9GVU5DIEZ1bmNfZHVwIF93c19kdXA7CiBFWFRFUk5fRlVOQyBGdW5jX3JlYWQgX3dzX3JlYWQ7CiBFWFRFUk5fRlVOQyBGdW5jX3JlYWR2IF93c19yZWFkdjsKIEVYVEVSTl9GVU5DIEZ1bmNfd3JpdGUgX3dzX3dyaXRlOwpAQCAtMjAxLDYgKzIwMyw5IEBACiAgICAgcHRocmVhZF9tdXRleF90IGZha2VGZExvY2s7CiAgICAgQml0VmVjdG9yKiAgZmFrZUZkTWFwOwogICAgIEZha2VEZXYqICAgIGZha2VGZExpc3Rba01heEZha2VGZENvdW50XTsKKworICAgIC8qIHVzZWQgZm9yIHdzQXRvbWljQWRkICovCisgICAgcHRocmVhZF9tdXRleF90IGF0b21pY0xvY2s7CiB9OwogCiBleHRlcm4gc3RydWN0IFdyYXBTaW1HbG9iYWxzIGdXcmFwU2ltOwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vSW5pdC5jIGIvc2ltdWxhdG9yL3dyYXBzaW0vSW5pdC5jCmluZGV4IGVlZDY1MGIuLjNkZjBlZmUgMTAwNjQ0Ci0tLSBhL3NpbXVsYXRvci93cmFwc2ltL0luaXQuYworKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9Jbml0LmMKQEAgLTQwLDYgKzQwLDcgQEAKICAgICBfd3Nfb3BlbjY0ID0gZGxzeW0oUlRMRF9ORVhULCAib3BlbjY0Iik7CiAKICAgICBfd3NfY2xvc2UgPSBkbHN5bShSVExEX05FWFQsICJjbG9zZSIpOworICAgIF93c19kdXAgPSBkbHN5bShSVExEX05FWFQsICJkdXAiKTsKICAgICBfd3NfcmVhZCA9IGRsc3ltKFJUTERfTkVYVCwgInJlYWQiKTsKICAgICBfd3NfcmVhZHYgPSBkbHN5bShSVExEX05FWFQsICJyZWFkdiIpOwogICAgIF93c193cml0ZSA9IGRsc3ltKFJUTERfTkVYVCwgIndyaXRlIik7CkBAIC0xMDgsNiArMTA5LDggQEAKICAgICBnV3JhcFNpbS5mYWtlRmRNYXAgPSB3c0FsbG9jQml0VmVjdG9yKGtNYXhGYWtlRmRDb3VudCwgMCk7CiAgICAgbWVtc2V0KGdXcmFwU2ltLmZha2VGZExpc3QsIDAsIHNpemVvZihnV3JhcFNpbS5mYWtlRmRMaXN0KSk7CiAKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmdXcmFwU2ltLmF0b21pY0xvY2ssIE5VTEwpOworCiAgICAgZ1dyYXBTaW0ubnVtRGlzcGxheXMgPSAwOwogCiAgICAgZ1dyYXBTaW0ua2V5SW5wdXREZXZpY2UgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vSW50ZXJjZXB0LmMgYi9zaW11bGF0b3Ivd3JhcHNpbS9JbnRlcmNlcHQuYwppbmRleCA0OWQ3N2VlLi4zZDRlZGIyIDEwMDY0NAotLS0gYS9zaW11bGF0b3Ivd3JhcHNpbS9JbnRlcmNlcHQuYworKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9JbnRlcmNlcHQuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgX3J0eXBlIF9mbmFtZSggX19WQV9BUkdTX18gKQogI2RlZmluZSBQQVNTX1RIUk9VR0hfQk9EWShfZm5hbWUsIF9wYXRoYXJnLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENBTExUUkFDRVYoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDQUxMVFJBQ0VWKCIlcyglcylcbiIsIF9fRlVOQ1RJT05fXywgX3BhdGhhcmcpOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgY2hhciBwYXRoQnVmW1BBVEhfTUFYXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHJldHVybiBfd3NfIyNfZm5hbWUocmV3cml0ZVBhdGgoI19mbmFtZSwgcGF0aEJ1ZiwgX3BhdGhhcmcpLCAgICAgICAgXAogICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTYzMSw2ICs2MzEsMzAgQEAKIH0KIAogCitpbnQgZHVwKGludCBmZCkKK3sKKyAgICBDQUxMVFJBQ0VWKCIlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgZmQpOworCisgICAgRmFrZURldiogZGV2ID0gd3NGYWtlRGV2RnJvbUZkKGZkKTsKKyAgICBpZiAoZGV2ICE9IE5VTEwpIHsKKyAgICAgICAgRmFrZURldiogbmV3RGV2ID0gZGV2LT5kdXAoZGV2LCBmZCk7CisgICAgICAgIGlmIChuZXdEZXYgIT0gTlVMTCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE5vdyB0aGF0IHRoZSBkZXZpY2UgZW50cnkgaXMgcmVhZHksIGFkZCBpdCB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd3NMb2coIiMjIGR1cCdlZCBmYWtlIGRldiAlZDogJyVzJyAlcFxuIiwKKyAgICAgICAgICAgICAgICBuZXdEZXYtPmZkLCBuZXdEZXYtPmRlYnVnTmFtZSwgbmV3RGV2LT5zdGF0ZSk7CisgICAgICAgICAgICBnV3JhcFNpbS5mYWtlRmRMaXN0W25ld0Rldi0+ZmQgLSBrRmFrZUZkQmFzZV0gPSBuZXdEZXY7CisgICAgICAgICAgICByZXR1cm4gbmV3RGV2LT5mZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0FMTFRSQUNFKCJkdXAoJWQpXG4iLCBmZCk7CisgICAgICAgIHJldHVybiBfd3NfZHVwKGZkKTsKKyAgICB9Cit9CisKKwogLyoKICAqIENsb3NlIGEgZmlsZSBkZXNjcmlwdG9yLgogICovCkBAIC03OTksNiArODIzLDE2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBQcmV0ZW5kIHRvIGJlIHJ1bm5pbmcgYXMgcm9vdCwgc28gdGhlIEFuZHJvaWQgZnJhbWV3b3JrCisgKiBkb2Vzbid0IGNvbXBsYWluIGFib3V0IHBlcm1pc3Npb24gcHJvYmxlbXMgYWxsIG92ZXIgdGhlCisgKiBwbGFjZS4KKyAqLwordWlkX3QgZ2V0dWlkKHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKICNpZiAwCiAvKgogICogQ3JlYXRlIGEgcGlwZS4gIChPbmx5IG5lZWRlZCBmb3IgZGVidWdnaW5nIGFuIGZkIGxlYWsuKQpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5jIGIvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDkwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmMKQEAgLTAsMCArMSwxMyBAQAorCisjaW5jbHVkZSAiQ29tbW9uLmgiCisKK2ludCB3c0F0b21pY0FkZChpbnQgKnZhciwgaW50IHZhbCkKK3sKKyAgICBpbnQgY2M7CisgICAgaW50IHJldDsKKyAgICBjYyA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1dyYXBTaW0uYXRvbWljTG9jayk7CisgICAgcmV0ID0gKnZhcjsKKyAgICAqdmFyID0gKnZhciArIHZhbDsKKyAgICBjYyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnV3JhcFNpbS5hdG9taWNMb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5oIGIvc2ltdWxhdG9yL3dyYXBzaW0vVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NzA4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaW11bGF0b3Ivd3JhcHNpbS9VdGlsLmgKQEAgLTAsMCArMSw0IEBACisKKworCitpbnQgd3NBdG9taWNBZGQoaW50ICp2YXIsIGludCB2YWwpOwpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci9ydW5fY29tbWFuZC5weSBiL3Rlc3RydW5uZXIvcnVuX2NvbW1hbmQucHkKaW5kZXggN2QxZjU0Ny4uNzljN2VhNSAxMDA3NTUKLS0tIGEvdGVzdHJ1bm5lci9ydW5fY29tbWFuZC5weQorKysgYi90ZXN0cnVubmVyL3J1bl9jb21tYW5kLnB5CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgZWxzZToKICAgICAjIE5lZWQgdGhlIGZ1bGwgcGF0aCB0byB2YWxncmluZCB0byBhdm9pZCBvdGhlciB2ZXJzaW9ucyBvbiB0aGUgc3lzdGVtLgogICAgIHN1YnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFsiL3Vzci9iaW4vdmFsZ3JpbmQiLCAiLS10b29sPW1lbWNoZWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tbGVhay1jaGVjaz15ZXMiLCAiLXEiLCBmdWxsX3BhdGhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1sZWFrLWNoZWNrPXllcyIsICItcSIsIGJpbmFyeV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQogICAgICMgQ2Fubm90IHJlbHkgb24gdGhlIHJldGNvZGUgb2YgdmFsZ3JpbmQuIEluc3RlYWQgbG9vayBmb3IgYW4gZW1wdHkgb3V0cHV0LgogICAgIHZhbGdyaW5kX291dCA9IHN1YnByb2MuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKaW5kZXggOWQwMzU1OC4uYzM5ODFiNCAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbApAQCAtNDQsNiArNDQsMTIgQEAKICAgICBjb3ZlcmFnZV90YXJnZXQ9ImZyYW1ld29yayIKICAgICBjb250aW51b3VzPSJ0cnVlIiAvPgogCis8dGVzdCBuYW1lPSJhY2NvdW50IgorICAgIGJ1aWxkX3BhdGg9ImZyYW1ld29ya3MvYmFzZS90ZXN0cy9BbmRyb2lkVGVzdHMiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudW5pdF90ZXN0cyIKKyAgICBjbGFzcz0iY29tLmFuZHJvaWQudW5pdF90ZXN0cy5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2VUZXN0IgorICAgIGNvdmVyYWdlX3RhcmdldD0iZnJhbWV3b3JrIiAvPgorCiA8dGVzdCBuYW1lPSJzbW9rZSIKICAgICBidWlsZF9wYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVzdHMvU21va2VUZXN0IgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnNtb2tldGVzdC50ZXN0cyIKQEAgLTEwMyw2ICsxMDksMTIgQEAKICAtLT4KIAogCis8dGVzdCBuYW1lPSJjb250ZW50cHJvdmlkZXJvcGVyYXRpb24iCisgICAgYnVpbGRfcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3Rlc3RzL0ZyYW1ld29ya1Rlc3QiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZnJhbWV3b3JrdGVzdC50ZXN0cyIKKyAgICBjbGFzcz0iYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvblRlc3QiCisgICAgY292ZXJhZ2VfdGFyZ2V0PSJmcmFtZXdvcmsiIC8+CisKIDx0ZXN0IG5hbWU9InRhYmxlbWVyZ2VyIgogICAgIGJ1aWxkX3BhdGg9ImZyYW1ld29ya3MvYmFzZS90ZXN0cy9GcmFtZXdvcmtUZXN0IgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3Rlc3QudGVzdHMiCkBAIC00MjcsNyArNDM5LDYgQEAKIDx0ZXN0IG5hbWU9Im1tcyIKICAgICBidWlsZF9wYXRoPSJwYWNrYWdlcy9hcHBzL01tcyIKICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tbXMudGVzdHMiCi0gICAgcnVubmVyPSJjb20uYW5kcm9pZC5tbXMudWkuTU1TSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKICAgICBjb3ZlcmFnZV90YXJnZXQ9Ik1tcyIgLz4KIAogPHRlc3QgbmFtZT0ibW1zbGF1bmNoIgpAQCAtNDUzLDYgKzQ2NCwxMCBAQAogICAgIGRlc2NyaXB0aW9uPSJCaW9uaWMgbGlic3RkYysrLiIKICAgICBleHRyYV9idWlsZF9hcmdzPSJCSU9OSUNfVEVTVFM9MSIgLz4KIAorPHRlc3QtbmF0aXZlIG5hbWU9ImxpYnNraWEiCisgICAgYnVpbGRfcGF0aD0iZXh0ZXJuYWwvc2tpYS90ZXN0cyIKKyAgICBkZXNjcmlwdGlvbj0iU2tpYSB0ZXN0cy4iIC8+CisKIDwhLS0gIEFuZHJvaWQgU1RMIHRlc3RzIC0tPgogPHRlc3QtbmF0aXZlIG5hbWU9ImFzdGwiCiAgICAgYnVpbGRfcGF0aD0iZXh0ZXJuYWwvYXN0bC90ZXN0cyIKZGlmZiAtLWdpdCBhL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YSBiL3Rvb2xzL2RkbXMvbGlicy9kZG1saWIvc3JjL2NvbS9hbmRyb2lkL2RkbWxpYi9IYW5kbGVQcm9maWxpbmcuamF2YQppbmRleCBlOGU4MTAzLi4wNzg5NjU1IDEwMDY0NAotLS0gYS90b29scy9kZG1zL2xpYnMvZGRtbGliL3NyYy9jb20vYW5kcm9pZC9kZG1saWIvSGFuZGxlUHJvZmlsaW5nLmphdmEKKysrIGIvdG9vbHMvZGRtcy9saWJzL2RkbWxpYi9zcmMvY29tL2FuZHJvaWQvZGRtbGliL0hhbmRsZVByb2ZpbGluZy5qYXZhCkBAIC03MywxMSArNzMsMTQgQEAKICAgICAvKioKICAgICAgKiBTZW5kIGEgTVBSUyAoTWV0aG9kIFBSb2ZpbGluZyBTdGFydCkgcmVxdWVzdCB0byB0aGUgY2xpZW50LgogICAgICAqCisgICAgICogVGhlIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCB3aWxsIGV2ZW50dWFsbHkgYmUgcGFzc2VkIHRvCisgICAgICogYW5kcm9pZC5vcy5EZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoKSBvbiB0aGUgZGV2aWNlLgorICAgICAqCiAgICAgICogQHBhcmFtIGZpbGVOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHByb2ZpbGluZyBkYXRhCiAgICAgICogICAgICAgICAgd2lsbCBiZSB3cml0dGVuIChvbiB0aGUgZGV2aWNlKTsgaXQgd2lsbCBoYXZlICIudHJhY2UiCiAgICAgICogICAgICAgICAgYXBwZW5kZWQgaWYgbmVjZXNzYXJ5CiAgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgaXMgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKDhNQiBpcyBnb29kKQotICAgICAqIEBwYXJhbSBmbGFncyBzaG91bGQgYmUgemVybworICAgICAqIEBwYXJhbSBmbGFncyBzZWUgc3RhcnRNZXRob2RUcmFjaW5nKCkgZG9jczsgdXNlIDAgZm9yIGRlZmF1bHQgYmVoYXZpb3IKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZE1QUlMoQ2xpZW50IGNsaWVudCwgU3RyaW5nIGZpbGVOYW1lLCBpbnQgYnVmZmVyU2l6ZSwKICAgICAgICAgaW50IGZsYWdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmFkdC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuYWR0Ly5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5jb21tb24vLmdpdGlnbm9yZSBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5jb21tb24vLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmNvbW1vbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyouamFyCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9pY29ucy8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDMyZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvaWNvbnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMxIEBACithZGQucG5nCitiYWNrd2FyZC5wbmcKK2NsZWFyLnBuZworZC5wbmcKK2RlYnVnLWF0dGFjaC5wbmcKK2RlYnVnLWVycm9yLnBuZworZGVidWctd2FpdC5wbmcKK2RlbGV0ZS5wbmcKK2RldmljZS5wbmcKK2Rvd24ucG5nCitlLnBuZworZWRpdC5wbmcKK2VtcHR5LnBuZworZW11bGF0b3IucG5nCitmb3J3YXJkLnBuZworZ2MucG5nCitoYWx0LnBuZworaGVhcC5wbmcKK2kucG5nCitpbXBvcnRCdWcucG5nCitsb2FkLnBuZworcGF1c2UucG5nCitwbGF5LnBuZworcHVsbC5wbmcKK3B1c2gucG5nCitzYXZlLnBuZwordGhyZWFkLnBuZwordXAucG5nCit2LnBuZwordy5wbmcKK3dhcm5pbmcucG5nCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9saWJzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VjbGlwc2UvcGx1Z2lucy9jb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5kZG1zL2xpYnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZGRtcy9zcmMvY29tL2FuZHJvaWQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQ5OTgxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmRkbXMvc3JjL2NvbS9hbmRyb2lkLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitkZG1saWIKK2RkbXVpbGliCmRpZmYgLS1naXQgYS90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UuZWRpdG9ycy8uZ2l0aWdub3JlIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLmVkaXRvcnMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACisqLmphcgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLy5naXRpZ25vcmUgYi90b29scy9lY2xpcHNlL3BsdWdpbnMvY29tLmFuZHJvaWQuaWRlLmVjbGlwc2UudGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkyZjBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWNsaXBzZS9wbHVnaW5zL2NvbS5hbmRyb2lkLmlkZS5lY2xpcHNlLnRlc3RzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5qYXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmR1bnVzZWQvZmluZHVudXNlZHJlc291cmNlcyBiL3Rvb2xzL2ZpbmR1bnVzZWQvZmluZHVudXNlZHJlc291cmNlcwppbmRleCA3NDgxMzlhLi41NGIxNTk2IDEwMDc1NQotLS0gYS90b29scy9maW5kdW51c2VkL2ZpbmR1bnVzZWRyZXNvdXJjZXMKKysrIGIvdG9vbHMvZmluZHVudXNlZC9maW5kdW51c2VkcmVzb3VyY2VzCkBAIC0yNiwxMSArMjYsMTUgQEAKIGZvciBhcHAgaW4gJGFwcHMKIGRvCiAgICAgZWNobyAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgaWYgWyAiJGFwcCIgPT0gIi4iIF0KKyAgICB0aGVuCisgICAgICAgIGFwcD0kKHB3ZCkKKyAgICBmaQogICAgIGlmIFsgLWQgJGFwcC9yZXMgXQogICAgIHRoZW4KICAgICAgICAgYXBwbmFtZT0kKGJhc2VuYW1lICRhcHApCiAgICAgICAgIHJlc291cmNlcz0KLSAgICAgICAgZm9yIHJlcyBpbiAkKGVjaG8gJGFwcC9yZXMvKikKKyAgICAgICAgZm9yIHJlcyBpbiAkKGVjaG8gJGFwcC9yZXMvKiAkKGZpbmQgJEFORFJPSURfQlVJTERfVE9QL3ZlbmRvciAtdHlwZSBkIC13aG9sZW5hbWUgJEFORFJPSURfQlVJTERfVE9QL3ZlbmRvci8qLyRhcHBuYW1lL3JlcyB8IGdyZXAgb3ZlcmxheSkpCiAgICAgICAgIGRvCiAgICAgICAgICAgICByZXNvdXJjZXM9IiRyZXNvdXJjZXMgJChlY2hvICRyZXMgfCBncmVwIC12ICdcLW1jY1x8W2Etel0qLVthLXpdW2Etel0kXHxbYS16XSotW2Etel1bYS16XS0uKicpIgogICAgICAgICBkb25lCkBAIC00NSwxOSArNDksMjUgQEAKICAgICAgICAgZmkKIAogICAgICAgICAjIGZpbmQgdGhlIFIuamF2YSBmaWxlIHRoYXQgY29udGFpbnMgYWxsIHRoZSBnZW5lcmF0ZWQgcmVzb3VyY2UgaWRlbnRpZmllcnMKLSAgICAgICAgckRvdEphdmE9JChmaW5kIG91dC90YXJnZXQvY29tbW9uL29iai9BUFBTLyR7YXBwbmFtZX1faW50ZXJtZWRpYXRlcy8gLW5hbWUgUi5qYXZhKQorICAgICAgICByRG90SmF2YT0kKGZpbmQgJEFORFJPSURfQlVJTERfVE9QL291dC90YXJnZXQvY29tbW9uL29iai9BUFBTLyR7YXBwbmFtZX1faW50ZXJtZWRpYXRlcy8gLW5hbWUgUi5qYXZhKQogCiAgICAgICAgICMgU2ltcGxpc3RpY2FsbHkgcHJvY2VzcyB0aGUgY29udGVudCBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY29uc3RhbnRzLAogICAgICAgICAjIGFuZCB0cnkgdG8gZmluZCBhIHJlZmVyZW5jZSB0byBlYWNoIGNvbnN0YW50LgorCisgICAgICAgICMgRmlyc3QgdGFrZSBhbGwgdGhlIGlucHV0IGZpbGVzIGFuZCBjb25jYXRlbmF0ZSB0aGVtLCByZW1vdmluZyBuZXdsaW5lcy4gVGhpcyBhbGxvd3MgdXMgdG8KKyAgICAgICAgIyBmaW5kIGV4cHJlc3Npb25zIHRoYXQgYXJlIGJyb2tlbiB1cCBvdmVyIG11bHRpcGxlIGxpbmVzLCBpLmUuIFIuZHJhd2FibGUuXG5zb21lY29uc3RhbnQKKyAgICAgICAgZmluZCAkcmVzb3VyY2VzICRzb3VyY2VzICRhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCAtdHlwZSBmIC1wcmludCB8eGFyZ3MgY2F0IHwgdHIgLWQgJ1xuICcgPiAvdG1wL2V2ZXJ5dGhpbmckJAorCisgICAgICAgICMgTm93IGxvb2sgZm9yIGVhY2ggb2YgdGhlIGNvbnN0YW50cyBpbiB0aGUgY29udGF0ZW5hdGVkIGZpbGUuCiAgICAgICAgIGZvciBpIGluICQoY2F0ICRyRG90SmF2YSB8IGdyZXAgIlx3Kj0weFxkKiIgfCBzZWQgJ3MvICpwdWJsaWMgc3RhdGljIGZpbmFsIGludCAvLycgfCBzZWQgJ3MvPTB4LiovLycpCiAgICAgICAgIGRvCiAgICAgICAgICAgICAjIFNpbmNlIHBlcmlvZHMgaW4gdGhlIG5hbWVzIGdldCB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzIGluIFIuamF2YSwgYW5kIHlvdSBjYW4gYWN0dWFsbHkKICAgICAgICAgICAgICMgcmVmZXIgdG8gc3VjaCBjb25zdGFudHMgZnJvbSBqYXZhIGJ5IHVzaW5nIGFuIHVuZGVyc2NvcmUgaW5zdGVhZCBvZiBhIHBlcmlvZCwgd2UgYWxzbwogICAgICAgICAgICAgIyByZXBsYWNlIGFsbCB1bmRlcnNjb3JlcyB3aXRoIGEgcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2ggcGVyaW9kcyBhbmQgdW5kZXJzY29yZXMuCiAgICAgICAgICAgICBwPSQoZWNobyAkaSB8IHNlZCAncy9fL1tcXC5fXS9nJykKLSAgICAgICAgICAgIGVjaG8gJGkgJChncmVwIC1SdyBSXFwuLipcXC4kaVxcXHxAc3R5bGUvJHBcXFx8QGRyYXdhYmxlLyRwXFxcfEBhbmltLyRwXFxcfEBjb2xvci8kcFxcXHxAeG1sLyRwXFxcfEBsYXlvdXQvJHBcXFx8QG1lbnUvJHBcXFx8QCtpZC8kcFxcXHxAYXJyYXkvJHBcXFx8QHN0cmluZy8kcFxcXHxAZGltZW4vJHAgJHJlc291cmNlcyAkc291cmNlcyAkYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgfCB3YyAtbCkKKyAgICAgICAgICAgIGVjaG8gJGkgJChncmVwIC1jdyBSXFwuLipcXC4kaVxcXHxAc3R5bGUvJHBcXFx8QGRyYXdhYmxlLyRwXFxcfEBhbmltLyRwXFxcfEBjb2xvci8kcFxcXHxAeG1sLyRwXFxcfEBsYXlvdXQvJHBcXFx8QG1lbnUvJHBcXFx8QCtpZC8kcFxcXHxAYXJyYXkvJHBcXFx8QHN0cmluZy8kcFxcXHxAZGltZW4vJHBcXFx8XFthLXpcXVwqOiRwXFxcfGVudW1uYW1lPVwiJHBcXFx8XDxpdGVtXD4kcFw8IDwgL3RtcC9ldmVyeXRoaW5nJCQpCiAgICAgICAgIGRvbmUgfCBncmVwICIgMCQiIHwgewotICAgICAgICAgICAgIyB0aGlzIGJsb2NrIGdldHMgYXMgaXRzIGlucHV0IGEgbGlzdCBvZiBjb25zdGFudHMgd2hpY2ggbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kLCBvbmUgcGVyIGxpbmUKKyAgICAgICAgICAgICMgdGhpcyBibG9jayBnZXRzIGFzIGl0cyBpbnB1dCBhIGxpc3Qgb2YgY29uc3RhbnRzIGZvciB3aGljaCBubyByZWZlcmVuY2VzIHdlcmUgZm91bmQsIG9uZSBwZXIgbGluZQogICAgICAgICAgICAgaWYgWyAiJHNob3dhbGwiID09ICJ5ZXMiIF0KICAgICAgICAgICAgIHRoZW4KICAgICAgICAgICAgICAgICBlY2hvICRhcHAKQEAgLTcwLDUgKzgwLDYgQEAKICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgZmkKICAgICAgICAgfQorICAgICAgICBybSAvdG1wL2V2ZXJ5dGhpbmckJAogICAgIGZpCiBkb25lCmRpZmYgLS1naXQgYS90b29scy9maW5kdW51c2VkL3JlbW92ZXVudXNlZHJlc291cmNlcyBiL3Rvb2xzL2ZpbmR1bnVzZWQvcmVtb3ZldW51c2VkcmVzb3VyY2VzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjMzg0OTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maW5kdW51c2VkL3JlbW92ZXVudXNlZHJlc291cmNlcwpAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vYmFzaAorCitpZiAhIHdoaWNoIHhtbHN0YXJsZXQgPiAvZGV2L251bGwKK3RoZW4KKyAgICBlY2hvICJZb3UgbmVlZCB0byBoYXZlIHRoZSAneG1sc3RhcmxldCcgY29tbWFuZCBpbiB5b3VyIHBhdGgiCisgICAgZXhpdAorZmkKKworYXBwcz0kMQorQ1dEPSQocHdkKS8KK2lmIFsgIiRhcHBzIiA9ICIiIF0KK3RoZW4KKyAgICBlY2hvICJQbGVhc2Ugc3BlY2lmeSB0aGUgcGF0aCB0byBhbiBhcHBsaWNhdGlvbiwgb3IgJy0tYWxsJyB0byBwcm9jZXNzIGFsbCBhcHBsaWNhdGlvbnMiCisgICAgZXhpdAorZWxpZiBbICIkYXBwcyIgPSAiLS1hbGwiIF0KK3RoZW4KKyAgICBhcHBzPSRBTkRST0lEX0JVSUxEX1RPUC9wYWNrYWdlcy9hcHBzLyoKK2ZpCisKK0JBU0U9JChwd2QpLyQoZGlybmFtZSAkMCkKKworZm9yIGFwcCBpbiAkYXBwcworZG8KKyAgICBwdXNoZCAkYXBwCisgICAgJEJBU0UvZmluZHVudXNlZHJlc291cmNlcyAtcCAuIHwgeworICAgICAgICByZWFkIExJTkUgTlVNCisgICAgICAgIHdoaWxlIFsgIiRMSU5FIiAhPSAiIiBdCisgICAgICAgIGRvCisgICAgICAgICAgICBpZiBbICJaJExJTkUiID0gIlotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICMgc2tpcAorICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAgICAgIGVsaWYgWyAiJExJTkUiID0gIiRhcHAiIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAjIHNraXAKKyAgICAgICAgICAgICAgICB0cnVlCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyB0cnkgdG8gZmluZCB0aGUgbWlzc2luZyByZXNvdXJjZQorICAgICAgICAgICAgICAgIGZpbmQgcmVzIHwgZ3JlcCAtdyAkTElORSAgfCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQgUkVTTElORQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBbICIkUkVTTElORSIgIT0gIiIgXQorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAkUkVTTElORSBdCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBSRU1PVklORyBGSUxFOiAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdCBybSAkUkVTTElORSA+IC9kZXYvbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gV0FSTklORyB1bmV4cGVjdGVkIHJlc3VsdCBmb3IgJExJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkIFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncmVwIC1Sd2wgJExJTkUgcmVzIHwgeworICAgICAgICAgICAgICAgICAgICByZWFkIFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgWyAiJFJFU0xJTkUiICE9ICIiIF0KKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIElTU1RSSU5HPSQoZWNobyAiJFJFU0xJTkUiIHwgZ3JlcCAtdyAic3RyaW5nc1wueG1sIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLW4gIiRJU1NUUklORyIgXQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gUkVNT1ZJTkcgU1RSSU5HICRMSU5FIGZyb20gJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxzdGFybGV0IGVkIC1QIC1TIC1kICIvcmVzb3VyY2VzL3N0cmluZ1tAbmFtZT0nJExJTkUnXSIgJFJFU0xJTkUgPiB0ZiQkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYgdGYkJCAkUkVTTElORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdCBhZGQgJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIFJFTU9WSU5HICRMSU5FIGZyb20gJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxzdGFybGV0IGVkIC1QIC1TIC1kICIvcmVzb3VyY2VzLypbQG5hbWU9JyRMSU5FJ10iICRSRVNMSU5FID4gdGYkJAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12IHRmJCQgJFJFU0xJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXQgYWRkICRSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBSRVNMSU5FCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaQorICAgICAgICAgICAgcmVhZCBMSU5FIE5VTQorICAgICAgICBkb25lCisgICAgfQorICAgIHBvcGQKK2RvbmUKK2VjaG8KK2VjaG8gIkRvbmUuIgorZWNobyAiUGxlYXNlIHJlYnVpbGQgdGhlIHVwZGF0ZWQgYXBwbGljYXRpb25zIHRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgc3RpbGwgYnVpbGRzLiIKK2VjaG8gIkFmdGVyIHJlYnVpbGRpbmcsIHJlcnVuICdmaW5kdW51c2VkcmVzb3VyY2VzJyBvciAncmVtb3ZldW51c2VkcmVzb3VyY2VzJyB0byBzZWUgaWYgYW55IG1vcmUgcmVzb3VyY2VzIGFyZSBub3cgdW51c2VkLiIKK2VjaG8gIldoZW4geW91J3JlIGRvbmUsIHlvdSBjYW4gJ2dpdCBjb21taXQnIHRoZSBjaGFuZ2UuIgorZWNobwo=