ZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5tayBiL2RybS9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzlhOTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgRHJtQ29uc3RyYWludHMuY3BwIFwKKyAgICBEcm1NZXRhZGF0YS5jcHAgXAorICAgIERybUNvbnZlcnRlZFN0YXR1cy5jcHAgXAorICAgIERybUVuZ2luZUJhc2UuY3BwIFwKKyAgICBEcm1JbmZvLmNwcCBcCisgICAgRHJtSW5mb1JlcXVlc3QuY3BwIFwKKyAgICBEcm1JbmZvU3RhdHVzLmNwcCBcCisgICAgRHJtUmlnaHRzLmNwcCBcCisgICAgRHJtU3VwcG9ydEluZm8uY3BwIFwKKyAgICBJRHJtSU9TZXJ2aWNlLmNwcCBcCisgICAgSURybU1hbmFnZXJTZXJ2aWNlLmNwcCBcCisgICAgSURybVNlcnZpY2VMaXN0ZW5lci5jcHAgXAorICAgIERybUluZm9FdmVudC5jcHAgXAorICAgIFJlYWRXcml0ZVV0aWxzLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBsaWJkcm1mcmFtZXdvcmtjb21tb24KKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1Db25zdHJhaW50cy5jcHAgYi9kcm0vY29tbW9uL0RybUNvbnN0cmFpbnRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTRkNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1Db25zdHJhaW50cy5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybUNvbnN0cmFpbnRzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpNQVhfUkVQRUFUX0NPVU5UKCJtYXhfcmVwZWF0X2NvdW50Iik7Citjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpSRU1BSU5JTkdfUkVQRUFUX0NPVU5UKCJyZW1haW5pbmdfcmVwZWF0X2NvdW50Iik7Citjb25zdCBTdHJpbmc4IERybUNvbnN0cmFpbnRzOjpMSUNFTlNFX1NUQVJUX1RJTUUoImxpY2Vuc2Vfc3RhcnRfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TElDRU5TRV9FWFBJUllfVElNRSgibGljZW5zZV9leHBpcnlfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6TElDRU5TRV9BVkFJTEFCTEVfVElNRSgibGljZW5zZV9hdmFpbGFibGVfdGltZSIpOworY29uc3QgU3RyaW5nOCBEcm1Db25zdHJhaW50czo6RVhURU5ERURfTUVUQURBVEEoImV4dGVuZGVkX21ldGFkYXRhIik7CisKK2ludCBEcm1Db25zdHJhaW50czo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtQ29uc3RyYWludE1hcC5zaXplKCk7Cit9CisKK3N0YXR1c190IERybUNvbnN0cmFpbnRzOjpwdXQoY29uc3QgU3RyaW5nOCoga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIGludCBsZW5ndGggPSBzdHJsZW4odmFsdWUpOworICAgIGNoYXIqIGNoYXJWYWx1ZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdOworICAgIGlmIChOVUxMICE9IGNoYXJWYWx1ZSkgeworICAgICAgICBzdHJuY3B5KGNoYXJWYWx1ZSwgdmFsdWUsIGxlbmd0aCk7CisgICAgICAgIGNoYXJWYWx1ZVtsZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgbUNvbnN0cmFpbnRNYXAuYWRkKCprZXksIGNoYXJWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtQ29uc3RyYWludHM6OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTlVMTCAhPSBnZXRWYWx1ZSgma2V5KSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOChnZXRWYWx1ZSgma2V5KSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KCIiKTsKK30KKworY29uc3QgY2hhciogRHJtQ29uc3RyYWludHM6OmdldFZhbHVlKGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3QgeworICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBtQ29uc3RyYWludE1hcC5pbmRleE9mS2V5KCprZXkpKSB7CisgICAgICAgIHJldHVybiBtQ29uc3RyYWludE1hcC52YWx1ZUZvcigqa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqIERybUNvbnN0cmFpbnRzOjpnZXRBc0J5dGVBcnJheShjb25zdCBTdHJpbmc4KiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoa2V5KTsKK30KKworYm9vbCBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1Db25zdHJhaW50cy0+bUNvbnN0cmFpbnRNYXAuc2l6ZSgpOworfQorCitjb25zdCBTdHJpbmc4JiBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Om5leHQoKSB7CisgICAgY29uc3QgU3RyaW5nOCYga2V5ID0gbURybUNvbnN0cmFpbnRzLT5tQ29uc3RyYWludE1hcC5rZXlBdChtSW5kZXgpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiBrZXk7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciBEcm1Db25zdHJhaW50czo6a2V5SXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEtleUl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yKGNvbnN0IERybUNvbnN0cmFpbnRzOjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpCisgICAgOiBtRHJtQ29uc3RyYWludHMoa2V5SXRlcmF0b3IubURybUNvbnN0cmFpbnRzKSwKKyAgICAgIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKK30KKworRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yJiBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKSB7CisgICAgbURybUNvbnN0cmFpbnRzID0ga2V5SXRlcmF0b3IubURybUNvbnN0cmFpbnRzOworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yIERybUNvbnN0cmFpbnRzOjppdGVyYXRvcigpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKK0RybUNvbnN0cmFpbnRzOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1Db25zdHJhaW50cyhpdGVyYXRvci5tRHJtQ29uc3RyYWludHMpLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKK30KKworRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yJiBEcm1Db25zdHJhaW50czo6SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1Db25zdHJhaW50czo6SXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybUNvbnN0cmFpbnRzID0gaXRlcmF0b3IubURybUNvbnN0cmFpbnRzOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtQ29uc3RyYWludHM6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtQ29uc3RyYWludHMtPm1Db25zdHJhaW50TWFwLnNpemUoKTsKK30KKworU3RyaW5nOCBEcm1Db25zdHJhaW50czo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCB2YWx1ZSA9IFN0cmluZzgobURybUNvbnN0cmFpbnRzLT5tQ29uc3RyYWludE1hcC5lZGl0VmFsdWVBdChtSW5kZXgpKTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtQ29udmVydGVkU3RhdHVzLmNwcCBiL2RybS9jb21tb24vRHJtQ29udmVydGVkU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAzNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1Db252ZXJ0ZWRTdGF0dXMuY3BwCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworRHJtQ29udmVydGVkU3RhdHVzOjpEcm1Db252ZXJ0ZWRTdGF0dXMoCisgICAgaW50IF9zdGF0dXNDb2RlLCBjb25zdCBEcm1CdWZmZXIqIF9jb252ZXJ0ZWREYXRhLCBpbnQgX29mZnNldCkgOgorICAgIHN0YXR1c0NvZGUoX3N0YXR1c0NvZGUpLAorICAgIGNvbnZlcnRlZERhdGEoX2NvbnZlcnRlZERhdGEpLAorICAgIG9mZnNldChfb2Zmc2V0KSB7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcCBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzNjBlYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiRHJtRW5naW5lQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworRHJtRW5naW5lQmFzZTo6RHJtRW5naW5lQmFzZSgpIHsKKworfQorCitEcm1FbmdpbmVCYXNlOjp+RHJtRW5naW5lQmFzZSgpIHsKKworfQorCitEcm1Db25zdHJhaW50cyogRHJtRW5naW5lQmFzZTo6Z2V0Q29uc3RyYWludHMoCisgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgcmV0dXJuIG9uR2V0Q29uc3RyYWludHModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1FbmdpbmVCYXNlOjpnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpIHsKKyAgICByZXR1cm4gb25HZXRNZXRhZGF0YSh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgcmV0dXJuIG9uSW5pdGlhbGl6ZSh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnNldE9uSW5mb0xpc3RlbmVyKAorICAgIGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgeworICAgIHJldHVybiBvblNldE9uSW5mb0xpc3RlbmVyKHVuaXF1ZUlkLCBpbmZvTGlzdGVuZXIpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjp0ZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSB7CisgICAgcmV0dXJuIG9uVGVybWluYXRlKHVuaXF1ZUlkKTsKK30KKworYm9vbCBEcm1FbmdpbmVCYXNlOjpjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgcmV0dXJuIG9uQ2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworRHJtSW5mb1N0YXR1cyogRHJtRW5naW5lQmFzZTo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgcmV0dXJuIG9uUHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzYXZlUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgcmV0dXJuIG9uU2F2ZVJpZ2h0cyh1bmlxdWVJZCwgZHJtUmlnaHRzLCByaWdodHNQYXRoLCBjb250ZW50UGF0aCk7Cit9CisKK0RybUluZm8qIERybUVuZ2luZUJhc2U6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgcmV0dXJuIG9uQWNxdWlyZURybUluZm8odW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKK30KKworU3RyaW5nOCBEcm1FbmdpbmVCYXNlOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBvbkdldE9yaWdpbmFsTWltZVR5cGUodW5pcXVlSWQsIHBhdGgpOworfQorCitpbnQgRHJtRW5naW5lQmFzZTo6Z2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgcmV0dXJuIG9uR2V0RHJtT2JqZWN0VHlwZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworfQorCitpbnQgRHJtRW5naW5lQmFzZTo6Y2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgcmV0dXJuIG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNvbnN1bWVSaWdodHMoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICByZXR1cm4gb25Db25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIG9uU2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7Cit9CisKK2Jvb2wgRHJtRW5naW5lQmFzZTo6dmFsaWRhdGVBY3Rpb24oCisgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIHJldHVybiBvblZhbGlkYXRlQWN0aW9uKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24sIGRlc2NyaXB0aW9uKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBvblJlbW92ZVJpZ2h0cyh1bmlxdWVJZCwgcGF0aCk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OnJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICByZXR1cm4gb25SZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgcmV0dXJuIG9uT3BlbkNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybUVuZ2luZUJhc2U6OmNvbnZlcnREYXRhKAorICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICByZXR1cm4gb25Db252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybUVuZ2luZUJhc2U6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgcmV0dXJuIG9uQ2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKK30KKworRHJtU3VwcG9ydEluZm8qIERybUVuZ2luZUJhc2U6OmdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBvbkdldFN1cHBvcnRJbmZvKHVuaXF1ZUlkKTsKK30KKworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgcmV0dXJuIG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICByZXR1cm4gb25Jbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworfQorCitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpkZWNyeXB0KAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIHJldHVybiBvbkRlY3J5cHQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7Cit9CisKK3N0YXR1c190IERybUVuZ2luZUJhc2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIHJldHVybiBvbkZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworfQorCitzc2l6ZV90IERybUVuZ2luZUJhc2U6OnByZWFkKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICByZXR1cm4gb25QcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1JbmZvLmNwcCBiL2RybS9jb21tb24vRHJtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjYWIzMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vRHJtSW5mby5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybUluZm8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybUluZm86OkRybUluZm8oaW50IGluZm9UeXBlLCBjb25zdCBEcm1CdWZmZXImIGRybUJ1ZmZlciwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIDoKKyAgICBtSW5mb1R5cGUoaW5mb1R5cGUpLAorICAgIG1EYXRhKGRybUJ1ZmZlciksCisgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSB7CisKK30KKworaW50IERybUluZm86OmdldEluZm9UeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZm9UeXBlOworfQorCitTdHJpbmc4IERybUluZm86OmdldE1pbWVUeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pbWVUeXBlOworfQorCitjb25zdCBEcm1CdWZmZXImIERybUluZm86OmdldERhdGEodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworaW50IERybUluZm86OmdldENvdW50KHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUF0dHJpYnV0ZXMuc2l6ZSgpOworfQorCitzdGF0dXNfdCBEcm1JbmZvOjpwdXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkgeworICAgIG1BdHRyaWJ1dGVzLmFkZChrZXksIHZhbHVlKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitTdHJpbmc4IERybUluZm86OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gbUF0dHJpYnV0ZXMuaW5kZXhPZktleShrZXkpKSB7CisgICAgICAgIHJldHVybiBtQXR0cmlidXRlcy52YWx1ZUZvcihrZXkpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOCgiIik7Cit9CisKK2ludCBEcm1JbmZvOjppbmRleE9mS2V5KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3QgeworICAgIHJldHVybiBtQXR0cmlidXRlcy5pbmRleE9mS2V5KGtleSk7Cit9CisKK0RybUluZm86OktleUl0ZXJhdG9yIERybUluZm86OmtleUl0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBLZXlJdGVyYXRvcih0aGlzKTsKK30KKworRHJtSW5mbzo6SXRlcmF0b3IgRHJtSW5mbzo6aXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKHRoaXMpOworfQorCisvLyBLZXlJdGVyYXRvciBpbXBsZW1lbnRhdGlvbgorRHJtSW5mbzo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yKGNvbnN0IERybUluZm86OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgOgorICAgIG1Ecm1JbmZvKGtleUl0ZXJhdG9yLm1Ecm1JbmZvKSwgbUluZGV4KGtleUl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK2Jvb2wgRHJtSW5mbzo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIChtSW5kZXggPCBtRHJtSW5mby0+bUF0dHJpYnV0ZXMuc2l6ZSgpKTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtSW5mbzo6S2V5SXRlcmF0b3I6Om5leHQoKSB7CisgICAgY29uc3QgU3RyaW5nOCYga2V5ID0gbURybUluZm8tPm1BdHRyaWJ1dGVzLmtleUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIGtleTsKK30KKworRHJtSW5mbzo6S2V5SXRlcmF0b3ImIERybUluZm86OktleUl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtSW5mbzo6S2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKSB7CisgICAgbURybUluZm8gPSBrZXlJdGVyYXRvci5tRHJtSW5mbzsKKyAgICBtSW5kZXggPSBrZXlJdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCisvLyBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbgorRHJtSW5mbzo6SXRlcmF0b3I6Okl0ZXJhdG9yKGNvbnN0IERybUluZm86Okl0ZXJhdG9yJiBpdGVyYXRvcikKKyAgICA6IG1Ecm1JbmZvKGl0ZXJhdG9yLm1Ecm1JbmZvKSwgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK0RybUluZm86Okl0ZXJhdG9yJiBEcm1JbmZvOjpJdGVyYXRvcjo6b3BlcmF0b3I9KGNvbnN0IERybUluZm86Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1JbmZvID0gaXRlcmF0b3IubURybUluZm87CisgICAgbUluZGV4ID0gaXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBEcm1JbmZvOjpJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbUluZGV4IDwgbURybUluZm8tPm1BdHRyaWJ1dGVzLnNpemUoKTsKK30KKworU3RyaW5nOCYgRHJtSW5mbzo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCYgdmFsdWUgPSBtRHJtSW5mby0+bUF0dHJpYnV0ZXMuZWRpdFZhbHVlQXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcCBiL2RybS9jb21tb24vRHJtSW5mb0V2ZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDExNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1JbmZvRXZlbnQuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybUluZm9FdmVudDo6RHJtSW5mb0V2ZW50KGludCB1bmlxdWVJZCwgaW50IGluZm9UeXBlLCBjb25zdCBTdHJpbmc4JiBtZXNzYWdlKQorICAgIDogbVVuaXF1ZUlkKHVuaXF1ZUlkKSwKKyAgICAgIG1JbmZvVHlwZShpbmZvVHlwZSksCisgICAgICBtTWVzc2FnZShtZXNzYWdlKSB7CisKK30KKworaW50IERybUluZm9FdmVudDo6Z2V0VW5pcXVlSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1VbmlxdWVJZDsKK30KKworaW50IERybUluZm9FdmVudDo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZm9UeXBlOworfQorCitjb25zdCBTdHJpbmc4JiBEcm1JbmZvRXZlbnQ6OmdldE1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1NZXNzYWdlOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUluZm9SZXF1ZXN0LmNwcCBiL2RybS9jb21tb24vRHJtSW5mb1JlcXVlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDY4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybUluZm9SZXF1ZXN0LmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0IFN0cmluZzggRHJtSW5mb1JlcXVlc3Q6OkFDQ09VTlRfSUQoImFjY291bnRfaWQiKTsKK2NvbnN0IFN0cmluZzggRHJtSW5mb1JlcXVlc3Q6OlNVQlNDUklQVElPTl9JRCgic3Vic2NyaXB0aW9uX2lkIik7CisKK0RybUluZm9SZXF1ZXN0OjpEcm1JbmZvUmVxdWVzdChpbnQgaW5mb1R5cGUsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA6CisgICAgbUluZm9UeXBlKGluZm9UeXBlKSwgbU1pbWVUeXBlKG1pbWVUeXBlKSB7CisKK30KKworU3RyaW5nOCBEcm1JbmZvUmVxdWVzdDo6Z2V0TWltZVR5cGUodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtTWltZVR5cGU7Cit9CisKK2ludCBEcm1JbmZvUmVxdWVzdDo6Z2V0SW5mb1R5cGUodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtSW5mb1R5cGU7Cit9CisKK2ludCBEcm1JbmZvUmVxdWVzdDo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtUmVxdWVzdEluZm9ybWF0aW9uTWFwLnNpemUoKTsKK30KKworc3RhdHVzX3QgRHJtSW5mb1JlcXVlc3Q6OnB1dChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7CisgICAgbVJlcXVlc3RJbmZvcm1hdGlvbk1hcC5hZGQoa2V5LCB2YWx1ZSk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworU3RyaW5nOCBEcm1JbmZvUmVxdWVzdDo6Z2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3QgeworICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBtUmVxdWVzdEluZm9ybWF0aW9uTWFwLmluZGV4T2ZLZXkoa2V5KSkgeworICAgICAgICByZXR1cm4gbVJlcXVlc3RJbmZvcm1hdGlvbk1hcC52YWx1ZUZvcihrZXkpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOCgiIik7Cit9CisKK0RybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciBEcm1JbmZvUmVxdWVzdDo6a2V5SXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEtleUl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1JbmZvUmVxdWVzdDo6SXRlcmF0b3IgRHJtSW5mb1JlcXVlc3Q6Oml0ZXJhdG9yKCkgY29uc3QgeworICAgIHJldHVybiBJdGVyYXRvcih0aGlzKTsKK30KKworLy8gS2V5SXRlcmF0b3IgaW1wbGVtZW50YXRpb24KK0RybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvcjo6S2V5SXRlcmF0b3IoY29uc3QgRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikKKyAgICA6IG1Ecm1JbmZvUmVxdWVzdChrZXlJdGVyYXRvci5tRHJtSW5mb1JlcXVlc3QpLAorICAgICAgbUluZGV4KGtleUl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK2Jvb2wgRHJtSW5mb1JlcXVlc3Q6OktleUl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiAobUluZGV4IDwgbURybUluZm9SZXF1ZXN0LT5tUmVxdWVzdEluZm9ybWF0aW9uTWFwLnNpemUoKSk7Cit9CisKK2NvbnN0IFN0cmluZzgmIERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvcjo6bmV4dCgpIHsKKyAgICBjb25zdCBTdHJpbmc4JiBrZXkgPSBtRHJtSW5mb1JlcXVlc3QtPm1SZXF1ZXN0SW5mb3JtYXRpb25NYXAua2V5QXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4ga2V5OworfQorCitEcm1JbmZvUmVxdWVzdDo6S2V5SXRlcmF0b3ImIERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvcjo6b3BlcmF0b3I9KAorICAgIGNvbnN0IERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpIHsKKyAgICBtRHJtSW5mb1JlcXVlc3QgPSBrZXlJdGVyYXRvci5tRHJtSW5mb1JlcXVlc3Q7CisgICAgbUluZGV4ID0ga2V5SXRlcmF0b3IubUluZGV4OworICAgIHJldHVybiAqdGhpczsKK30KKworLy8gSXRlcmF0b3IgaW1wbGVtZW50YXRpb24KK0RybUluZm9SZXF1ZXN0OjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1JbmZvUmVxdWVzdChpdGVyYXRvci5tRHJtSW5mb1JlcXVlc3QpLCBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7Cit9CisKK0RybUluZm9SZXF1ZXN0OjpJdGVyYXRvciYgRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1JbmZvUmVxdWVzdCA9IGl0ZXJhdG9yLm1Ecm1JbmZvUmVxdWVzdDsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybUluZm9SZXF1ZXN0OjpJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbUluZGV4IDwgbURybUluZm9SZXF1ZXN0LT5tUmVxdWVzdEluZm9ybWF0aW9uTWFwLnNpemUoKTsKK30KKworU3RyaW5nOCYgRHJtSW5mb1JlcXVlc3Q6Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbURybUluZm9SZXF1ZXN0LT5tUmVxdWVzdEluZm9ybWF0aW9uTWFwLmVkaXRWYWx1ZUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUluZm9TdGF0dXMuY3BwIGIvZHJtL2NvbW1vbi9Ecm1JbmZvU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWM3MzExCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1JbmZvU3RhdHVzLmNwcApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGRybS9Ecm1JbmZvU3RhdHVzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1JbmZvU3RhdHVzOjpEcm1JbmZvU3RhdHVzKAorICAgIGludCBfc3RhdHVzQ29kZSwgaW50IF9pbmZvVHlwZSwgY29uc3QgRHJtQnVmZmVyKiBfZHJtQnVmZmVyLCBjb25zdCBTdHJpbmc4JiBfbWltZVR5cGUpIDoKKyAgICBzdGF0dXNDb2RlKF9zdGF0dXNDb2RlKSwKKyAgICBpbmZvVHlwZShfaW5mb1R5cGUpLAorICAgIGRybUJ1ZmZlcihfZHJtQnVmZmVyKSwKKyAgICBtaW1lVHlwZShfbWltZVR5cGUpIHsKKworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybU1ldGFkYXRhLmNwcCBiL2RybS9jb21tb24vRHJtTWV0YWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybU1ldGFkYXRhLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBEcm1NZXRhZGF0YTo6Z2V0Q291bnQodm9pZCkgY29uc3QgeworCXJldHVybiBtTWV0YWRhdGFNYXAuc2l6ZSgpOworfQorCitzdGF0dXNfdCBEcm1NZXRhZGF0YTo6cHV0KGNvbnN0IFN0cmluZzgqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBpZigodmFsdWUgIT0gTlVMTCkgJiYgKGtleSAhPSBOVUxMKSkgeworICAgICAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHZhbHVlKTsKKyAgICAgICAgY2hhciogY2hhclZhbHVlID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CisKKyAgICAgICAgbWVtY3B5KGNoYXJWYWx1ZSwgdmFsdWUsIGxlbmd0aCk7CisgICAgICAgIGNoYXJWYWx1ZVtsZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgbU1ldGFkYXRhTWFwLmFkZCgqa2V5LCBjaGFyVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtTWV0YWRhdGE6OmdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKKyAgICBpZiAoTlVMTCAhPSBnZXRWYWx1ZSgma2V5KSkgeworICAgICAgICByZXR1cm4gU3RyaW5nOChnZXRWYWx1ZSgma2V5KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CisgICAgfQorfQorCitjb25zdCBjaGFyKiBEcm1NZXRhZGF0YTo6Z2V0VmFsdWUoY29uc3QgU3RyaW5nOCoga2V5KSBjb25zdCB7CisgICAgaWYoa2V5ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IG1NZXRhZGF0YU1hcC5pbmRleE9mS2V5KCprZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhTWFwLnZhbHVlRm9yKCprZXkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIERybU1ldGFkYXRhOjpnZXRBc0J5dGVBcnJheShjb25zdCBTdHJpbmc4KiBrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoa2V5KTsKK30KKworYm9vbCBEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLnNpemUoKTsKK30KKworY29uc3QgU3RyaW5nOCYgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpuZXh0KCkgeworICAgIGNvbnN0IFN0cmluZzgmIGtleSA9IG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLmtleUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIGtleTsKK30KKworRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yIERybU1ldGFkYXRhOjprZXlJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gS2V5SXRlcmF0b3IodGhpcyk7Cit9CisKK0RybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6S2V5SXRlcmF0b3IoY29uc3QgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgOgorICAgIG1Ecm1NZXRhZGF0YShrZXlJdGVyYXRvci5tRHJtTWV0YWRhdGEpLAorICAgIG1JbmRleChrZXlJdGVyYXRvci5tSW5kZXgpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3I6OktleUl0ZXJhdG9yIik7Cit9CisKK0RybU1ldGFkYXRhOjpLZXlJdGVyYXRvciYgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtTWV0YWRhdGE6OktleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcikgeworICAgIExPR1YoIkRybU1ldGFkYXRhOjpLZXlJdGVyYXRvcjo6b3BlcmF0b3I9Iik7CisgICAgbURybU1ldGFkYXRhID0ga2V5SXRlcmF0b3IubURybU1ldGFkYXRhOworICAgIG1JbmRleCA9IGtleUl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworRHJtTWV0YWRhdGE6Okl0ZXJhdG9yIERybU1ldGFkYXRhOjppdGVyYXRvcigpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IodGhpcyk7Cit9CisKK0RybU1ldGFkYXRhOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1Ecm1NZXRhZGF0YShpdGVyYXRvci5tRHJtTWV0YWRhdGEpLAorICAgIG1JbmRleChpdGVyYXRvci5tSW5kZXgpIHsKKyAgICBMT0dWKCJEcm1NZXRhZGF0YTo6SXRlcmF0b3I6Okl0ZXJhdG9yIik7Cit9CisKK0RybU1ldGFkYXRhOjpJdGVyYXRvciYgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpvcGVyYXRvcj0oY29uc3QgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIExPR1YoIkRybU1ldGFkYXRhOjpJdGVyYXRvcjo6b3BlcmF0b3I9Iik7CisgICAgbURybU1ldGFkYXRhID0gaXRlcmF0b3IubURybU1ldGFkYXRhOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpoYXNOZXh0KCkgeworICAgIHJldHVybiBtSW5kZXggPCBtRHJtTWV0YWRhdGEtPm1NZXRhZGF0YU1hcC5zaXplKCk7Cit9CisKK1N0cmluZzggRHJtTWV0YWRhdGE6Okl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzggdmFsdWUgPSBTdHJpbmc4KG1Ecm1NZXRhZGF0YS0+bU1ldGFkYXRhTWFwLmVkaXRWYWx1ZUF0KG1JbmRleCkpOworICAgIG1JbmRleCsrOworICAgIHJldHVybiB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vRHJtUmlnaHRzLmNwcCBiL2RybS9jb21tb24vRHJtUmlnaHRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjYjNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9Ecm1SaWdodHMuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZHJtL0RybVJpZ2h0cy5oPgorI2luY2x1ZGUgPFJlYWRXcml0ZVV0aWxzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitEcm1SaWdodHM6OkRybVJpZ2h0cyhjb25zdCBTdHJpbmc4JiByaWdodHNGaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhY2NvdW50SWQsIGNvbnN0IFN0cmluZzgmIHN1YnNjcmlwdGlvbklkKSA6CisgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKKyAgICBtQWNjb3VudElkKGFjY291bnRJZCksCisgICAgbVN1YnNjcmlwdGlvbklkKHN1YnNjcmlwdGlvbklkKSwKKyAgICBtUmlnaHRzRnJvbUZpbGUoTlVMTCkgeworICAgIGludCByaWdodHNMZW5ndGggPSAwOworICAgIGlmIChTdHJpbmc4KCIiKSAhPSByaWdodHNGaWxlUGF0aCkgeworICAgICAgICByaWdodHNMZW5ndGggPSBSZWFkV3JpdGVVdGlsczo6cmVhZEJ5dGVzKHJpZ2h0c0ZpbGVQYXRoLCAmbVJpZ2h0c0Zyb21GaWxlKTsKKyAgICB9CisgICAgbURhdGEgPSBEcm1CdWZmZXIobVJpZ2h0c0Zyb21GaWxlLCByaWdodHNMZW5ndGgpOworfQorCitEcm1SaWdodHM6OkRybVJpZ2h0cyhjb25zdCBEcm1CdWZmZXImIHJpZ2h0c0RhdGEsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWNjb3VudElkLCBjb25zdCBTdHJpbmc4JiBzdWJzY3JpcHRpb25JZCkgOgorICAgIG1EYXRhKHJpZ2h0c0RhdGEpLAorICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCisgICAgbUFjY291bnRJZChhY2NvdW50SWQpLAorICAgIG1TdWJzY3JpcHRpb25JZChzdWJzY3JpcHRpb25JZCksCisgICAgbVJpZ2h0c0Zyb21GaWxlKE5VTEwpIHsKK30KKworRHJtUmlnaHRzOjp+RHJtUmlnaHRzKCkgeworICAgIGRlbGV0ZVtdIG1SaWdodHNGcm9tRmlsZTsgbVJpZ2h0c0Zyb21GaWxlID0gTlVMTDsKK30KKworY29uc3QgRHJtQnVmZmVyJiBEcm1SaWdodHM6OmdldERhdGEodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworU3RyaW5nOCBEcm1SaWdodHM6OmdldE1pbWVUeXBlKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1pbWVUeXBlOworfQorCitTdHJpbmc4IERybVJpZ2h0czo6Z2V0QWNjb3VudElkKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFjY291bnRJZDsKK30KKworU3RyaW5nOCBEcm1SaWdodHM6OmdldFN1YnNjcmlwdGlvbklkKHZvaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN1YnNjcmlwdGlvbklkOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcCBiL2RybS9jb21tb24vRHJtU3VwcG9ydEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYzg5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0RybVN1cHBvcnRJbmZvLmNwcApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybVN1cHBvcnRJbmZvOjpEcm1TdXBwb3J0SW5mbygpIHsKKworfQorCitEcm1TdXBwb3J0SW5mbzo6RHJtU3VwcG9ydEluZm8oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKToKKyAgICBtTWltZVR5cGVWZWN0b3IoZHJtU3VwcG9ydEluZm8ubU1pbWVUeXBlVmVjdG9yKSwKKyAgICBtRmlsZVN1ZmZpeFZlY3Rvcihkcm1TdXBwb3J0SW5mby5tRmlsZVN1ZmZpeFZlY3RvciksCisgICAgbURlc2NyaXB0aW9uKGRybVN1cHBvcnRJbmZvLm1EZXNjcmlwdGlvbikgeworCit9CisKK2Jvb2wgRHJtU3VwcG9ydEluZm86Om9wZXJhdG9yPChjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pIGNvbnN0IHsKKyAgICAvLyBEbyB3ZSBuZWVkIHRvIGNoZWNrIG1NaW1lVHlwZVZlY3RvciAmIG1GaWxlU3VmZml4VmVjdG9yID8KKyAgICAvLyBOb3RlIFZlY3RvciBkb2Vzbid0IG92ZXJyaWRlcyAiPCIgb3BlcmF0b3IKKyAgICByZXR1cm4gbURlc2NyaXB0aW9uIDwgZHJtU3VwcG9ydEluZm8ubURlc2NyaXB0aW9uOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpvcGVyYXRvcj09KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbykgY29uc3QgeworICAgIC8vIERvIHdlIG5lZWQgdG8gY2hlY2sgbU1pbWVUeXBlVmVjdG9yICYgbUZpbGVTdWZmaXhWZWN0b3IgPworICAgIC8vIE5vdGUgVmVjdG9yIGRvZXNuJ3Qgb3ZlcnJpZGVzICI9PSIgb3BlcmF0b3IKKyAgICByZXR1cm4gKG1EZXNjcmlwdGlvbiA9PSBkcm1TdXBwb3J0SW5mby5tRGVzY3JpcHRpb24pOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBtTWltZVR5cGVWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBpdGVtID0gbU1pbWVUeXBlVmVjdG9yLml0ZW1BdChpKTsKKworICAgICAgICBpZiAoU3RyaW5nOCgiIikgIT0gbWltZVR5cGUgJiYgaXRlbS5maW5kKG1pbWVUeXBlKSAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjppc1N1cHBvcnRlZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVR5cGUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzggaXRlbSA9IG1GaWxlU3VmZml4VmVjdG9yLml0ZW1BdChpKTsKKworICAgICAgICBpZiAoU3RyaW5nOCgiIikgIT0gZmlsZVR5cGUgJiYgaXRlbS5maW5kKGZpbGVUeXBlKSAhPSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitEcm1TdXBwb3J0SW5mbyYgRHJtU3VwcG9ydEluZm86Om9wZXJhdG9yPShjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pIHsKKyAgICBtTWltZVR5cGVWZWN0b3IgPSBkcm1TdXBwb3J0SW5mby5tTWltZVR5cGVWZWN0b3I7CisgICAgbUZpbGVTdWZmaXhWZWN0b3IgPSBkcm1TdXBwb3J0SW5mby5tRmlsZVN1ZmZpeFZlY3RvcjsKKyAgICBtRGVzY3JpcHRpb24gPSBkcm1TdXBwb3J0SW5mby5tRGVzY3JpcHRpb247CisgICAgcmV0dXJuICp0aGlzOworfQorCitpbnQgRHJtU3VwcG9ydEluZm86OmdldE1pbWVUeXBlQ291bnQodm9pZCkgY29uc3QgeworICAgIHJldHVybiBtTWltZVR5cGVWZWN0b3Iuc2l6ZSgpOworfQorCitpbnQgRHJtU3VwcG9ydEluZm86OmdldEZpbGVTdWZmaXhDb3VudCh2b2lkKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlU3VmZml4VmVjdG9yLnNpemUoKTsKK30KKworc3RhdHVzX3QgRHJtU3VwcG9ydEluZm86OmFkZE1pbWVUeXBlKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgbU1pbWVUeXBlVmVjdG9yLnB1c2gobWltZVR5cGUpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVN1cHBvcnRJbmZvOjphZGRGaWxlU3VmZml4KGNvbnN0IFN0cmluZzgmIGZpbGVTdWZmaXgpIHsKKyAgICBtRmlsZVN1ZmZpeFZlY3Rvci5wdXNoKGZpbGVTdWZmaXgpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVN1cHBvcnRJbmZvOjpzZXREZXNjcmlwdGlvbihjb25zdCBTdHJpbmc4JiBkZXNjcmlwdGlvbikgeworICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK1N0cmluZzggRHJtU3VwcG9ydEluZm86OmdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtRGVzY3JpcHRpb247Cit9CisKK0RybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3IgRHJtU3VwcG9ydEluZm86OmdldEZpbGVTdWZmaXhJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gRmlsZVN1ZmZpeEl0ZXJhdG9yKHRoaXMpOworfQorCitEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciBEcm1TdXBwb3J0SW5mbzo6Z2V0TWltZVR5cGVJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gTWltZVR5cGVJdGVyYXRvcih0aGlzKTsKK30KKworRHJtU3VwcG9ydEluZm86OkZpbGVTdWZmaXhJdGVyYXRvcjo6RmlsZVN1ZmZpeEl0ZXJhdG9yKAorICAgIGNvbnN0IERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3ImIGl0ZXJhdG9yKSA6CisgICAgbURybVN1cHBvcnRJbmZvKGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbyksCisgICAgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworCit9CisKK0RybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3ImIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3I6Om9wZXJhdG9yPSgKKyAgICBjb25zdCBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1Ecm1TdXBwb3J0SW5mbyA9IGl0ZXJhdG9yLm1Ecm1TdXBwb3J0SW5mbzsKKyAgICBtSW5kZXggPSBpdGVyYXRvci5tSW5kZXg7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1TdXBwb3J0SW5mby0+bUZpbGVTdWZmaXhWZWN0b3Iuc2l6ZSgpOworfQorCitTdHJpbmc4JiBEcm1TdXBwb3J0SW5mbzo6RmlsZVN1ZmZpeEl0ZXJhdG9yOjpuZXh0KCkgeworICAgIFN0cmluZzgmIHZhbHVlID0gbURybVN1cHBvcnRJbmZvLT5tRmlsZVN1ZmZpeFZlY3Rvci5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvcjo6TWltZVR5cGVJdGVyYXRvcigKKyAgICBjb25zdCBEcm1TdXBwb3J0SW5mbzo6TWltZVR5cGVJdGVyYXRvciYgaXRlcmF0b3IpIDoKKyAgICBtRHJtU3VwcG9ydEluZm8oaXRlcmF0b3IubURybVN1cHBvcnRJbmZvKSwKKyAgICBtSW5kZXgoaXRlcmF0b3IubUluZGV4KSB7CisKK30KKworRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3ImIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgY29uc3QgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3ImIGl0ZXJhdG9yKSB7CisgICAgbURybVN1cHBvcnRJbmZvID0gaXRlcmF0b3IubURybVN1cHBvcnRJbmZvOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3I6Omhhc05leHQoKSB7CisgICAgcmV0dXJuIG1JbmRleCA8IG1Ecm1TdXBwb3J0SW5mby0+bU1pbWVUeXBlVmVjdG9yLnNpemUoKTsKK30KKworU3RyaW5nOCYgRHJtU3VwcG9ydEluZm86Ok1pbWVUeXBlSXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCYgdmFsdWUgPSBtRHJtU3VwcG9ydEluZm8tPm1NaW1lVHlwZVZlY3Rvci5lZGl0SXRlbUF0KG1JbmRleCk7CisgICAgbUluZGV4Kys7CisgICAgcmV0dXJuIHZhbHVlOworfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1JT1NlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtSU9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRjYTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9JRHJtSU9TZXJ2aWNlLmNwcApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlICJJRHJtSU9TZXJ2aWNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit2b2lkIEJwRHJtSU9TZXJ2aWNlOjp3cml0ZVRvRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY29uc3QgU3RyaW5nOCYgZGF0YUJ1ZmZlcikgeworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtSU9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGZpbGVQYXRoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkYXRhQnVmZmVyKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChXUklURV9UT19GSUxFLCBkYXRhLCAmcmVwbHkpOworfQorCitTdHJpbmc4IEJwRHJtSU9TZXJ2aWNlOjpyZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpIHsKKworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtSU9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGZpbGVQYXRoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUFEX0ZST01fRklMRSwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZFN0cmluZzgoKTsKK30KKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERybUlPU2VydmljZSwgImRybS5JRHJtSU9TZXJ2aWNlIik7CisKK3N0YXR1c190IEJuRHJtSU9TZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgV1JJVEVfVE9fRklMRToKKyAgICB7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtSU9TZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgd3JpdGVUb0ZpbGUoZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUkVBRF9GUk9NX0ZJTEU6CisgICAgeworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybUlPU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIFN0cmluZzggZGF0YUJ1ZmZlciA9IHJlYWRGcm9tRmlsZShkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGRhdGFCdWZmZXIpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYjUwZQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE1MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklEcm1NYW5hZ2VyU2VydmljZShOYXRpdmUpIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisKKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NZXRhZGF0YS5oPgorI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKworI2luY2x1ZGUgIklEcm1NYW5hZ2VyU2VydmljZS5oIgorCisjZGVmaW5lIElOVkFMSURfQlVGRkVSX0xFTkdUSCAtMQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoImFkZCB1bmlxdWVpZCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFERF9VTklRVUVJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3ZvaWQgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlVW5pcXVlSWQoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HVigicmVtb3ZlIHVuaXF1ZWlkIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VOSVFVRUlELCBkYXRhLCAmcmVwbHkpOworfQorCit2b2lkIEJwRHJtTWFuYWdlclNlcnZpY2U6OmFkZENsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChBRERfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworfQorCit2b2lkIEJwRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpIHsKKyAgICBMT0dWKCJzZXREcm1TZXJ2aWNlTGlzdGVuZXIiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkcm1TZXJ2aWNlTGlzdGVuZXItPmFzQmluZGVyKCkpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfRFJNX1NFUlZJQ0VfTElTVEVORVIsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgeworICAgIExPR1YoIkluc3RhbGwgRFJNIEVuZ2luZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1FbmdpbmVGaWxlKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTlNUQUxMX0RSTV9FTkdJTkUsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEcm1Db25zdHJhaW50cyogQnBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJHZXQgQ29uc3RyYWludHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKnBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT05TVFJBSU5UU19GUk9NX0NPTlRFTlQsIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEcm0gQ29uc3RyYWludHMKKyAgICAgICAgZHJtQ29uc3RyYWludHMgPSBuZXcgRHJtQ29uc3RyYWludHMoKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybUNvbnN0cmFpbnRzLT5wdXQoJmtleSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnN0cmFpbnRzOworfQorCitEcm1NZXRhZGF0YSogQnBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgTE9HVigiR2V0IE1ldGFkYXRhIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSA9IE5VTEw7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKnBhdGgpOworICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUVUQURBVEFfRlJPTV9DT05URU5ULCBkYXRhLCAmcmVwbHkpOworCisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERybSBNZXRhZGF0YQorICAgICAgICBkcm1NZXRhZGF0YSA9IG5ldyBEcm1NZXRhZGF0YSgpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShyZXBseS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHJtTWV0YWRhdGEtPnB1dCgma2V5LCBkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHJtTWV0YWRhdGE7Cit9CisKK2Jvb2wgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJDYW4gSGFuZGxlIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZVN0cmluZzgocGF0aCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgobWltZVR5cGUpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTl9IQU5ETEUsIGRhdGEsICZyZXBseSk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpOworfQorCitEcm1JbmZvU3RhdHVzKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICBMT0dWKCJQcm9jZXNzIERSTSBJbmZvIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgLy9GaWxsaW5nIERSTSBpbmZvCisgICAgZGF0YS53cml0ZUludDMyKGRybUluZm8tPmdldEluZm9UeXBlKCkpOworICAgIGNvbnN0IERybUJ1ZmZlciBkYXRhQnVmZmVyID0gZHJtSW5mby0+Z2V0RGF0YSgpOworICAgIGNvbnN0IGludCBkYXRhQnVmZmVyU2l6ZSA9IGRhdGFCdWZmZXIubGVuZ3RoOworICAgIGRhdGEud3JpdGVJbnQzMihkYXRhQnVmZmVyU2l6ZSk7CisgICAgaWYgKDAgPCBkYXRhQnVmZmVyU2l6ZSkgeworICAgICAgICBkYXRhLndyaXRlKGRhdGFCdWZmZXIuZGF0YSwgZGF0YUJ1ZmZlclNpemUpOworICAgIH0KKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkcm1JbmZvLT5nZXRDb3VudCgpKTsKKyAgICBEcm1JbmZvOjpLZXlJdGVyYXRvciBrZXlJdCA9IGRybUluZm8tPmtleUl0ZXJhdG9yKCk7CisKKyAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChrZXkpOworICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlID0gZHJtSW5mby0+Z2V0KGtleSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KCh2YWx1ZSA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiB2YWx1ZSk7CisgICAgfQorCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBST0NFU1NfRFJNX0lORk8sIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1JbmZvU3RhdHVzKiBkcm1JbmZvU3RhdHVzID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRFJNIEluZm8gU3RhdHVzCisgICAgICAgIGNvbnN0IGludCBzdGF0dXNDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBpbmZvVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4IG1pbWVUeXBlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEcm1CdWZmZXIqIGRybUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRybUJ1ZmZlciA9IG5ldyBEcm1CdWZmZXIoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZHJtSW5mb1N0YXR1cyA9IG5ldyBEcm1JbmZvU3RhdHVzKHN0YXR1c0NvZGUsIGluZm9UeXBlLCBkcm1CdWZmZXIsIG1pbWVUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7Cit9CisKK0RybUluZm8qIEJwRHJtTWFuYWdlclNlcnZpY2U6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KSB7CisgICAgTE9HVigiQWNxdWlyZSBEUk0gSW5mbyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIC8vRmlsbGluZyBEUk0gSW5mbyBSZXF1ZXN0CisgICAgZGF0YS53cml0ZUludDMyKGRybUluZm9yZXF1ZXN0LT5nZXRJbmZvVHlwZSgpKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkcm1JbmZvcmVxdWVzdC0+Z2V0TWltZVR5cGUoKSk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZHJtSW5mb3JlcXVlc3QtPmdldENvdW50KCkpOworICAgIERybUluZm9SZXF1ZXN0OjpLZXlJdGVyYXRvciBrZXlJdCA9IGRybUluZm9yZXF1ZXN0LT5rZXlJdGVyYXRvcigpOworCisgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCB2YWx1ZSA9IGRybUluZm9yZXF1ZXN0LT5nZXQoa2V5KTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoKHZhbHVlID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHZhbHVlKTsKKyAgICB9CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUNRVUlSRV9EUk1fSU5GTywgZGF0YSwgJnJlcGx5KTsKKworICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOworICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgIC8vRmlsbGluZyBEUk0gSW5mbworICAgICAgICBjb25zdCBpbnQgaW5mb1R5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisKKyAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICByZXBseS5yZWFkKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGRybUluZm8gPSBuZXcgRHJtSW5mbyhpbmZvVHlwZSwgRHJtQnVmZmVyKGRhdGEsIGJ1ZmZlclNpemUpLCByZXBseS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICBjb25zdCBpbnQgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlKHJlcGx5LnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgZHJtSW5mby0+cHV0KGtleSwgKHZhbHVlID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6c2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIExPR1YoIlNhdmUgUmlnaHRzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgLy9GaWxsaW5nIERybSBSaWdodHMKKyAgICBjb25zdCBEcm1CdWZmZXIgZGF0YUJ1ZmZlciA9IGRybVJpZ2h0cy5nZXREYXRhKCk7CisgICAgZGF0YS53cml0ZUludDMyKGRhdGFCdWZmZXIubGVuZ3RoKTsKKyAgICBkYXRhLndyaXRlKGRhdGFCdWZmZXIuZGF0YSwgZGF0YUJ1ZmZlci5sZW5ndGgpOworCisgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IGRybVJpZ2h0cy5nZXRNaW1lVHlwZSgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KChtaW1lVHlwZSA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBtaW1lVHlwZSk7CisKKyAgICBjb25zdCBTdHJpbmc4IGFjY291bnRJZCA9IGRybVJpZ2h0cy5nZXRBY2NvdW50SWQoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOCgoYWNjb3VudElkID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IGFjY291bnRJZCk7CisKKyAgICBjb25zdCBTdHJpbmc4IHN1YnNjcmlwdGlvbklkID0gZHJtUmlnaHRzLmdldFN1YnNjcmlwdGlvbklkKCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoKHN1YnNjcmlwdGlvbklkID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHN1YnNjcmlwdGlvbklkKTsKKworICAgIGRhdGEud3JpdGVTdHJpbmc4KChyaWdodHNQYXRoID09IFN0cmluZzgoIiIpKSA/IFN0cmluZzgoIk5VTEwiKSA6IHJpZ2h0c1BhdGgpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KChjb250ZW50UGF0aCA9PSBTdHJpbmc4KCIiKSkgPyBTdHJpbmc4KCJOVUxMIikgOiBjb250ZW50UGF0aCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0FWRV9SSUdIVFMsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitTdHJpbmc4IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HVigiR2V0IE9yaWdpbmFsIE1pbWVUeXBlIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PUklHSU5BTF9NSU1FVFlQRSwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZFN0cmluZzgoKTsKK30KKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldERybU9iamVjdFR5cGUoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiR2V0IERybSBvYmplY3QgdHlwZSIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RSTV9PQkpFQ1RfVFlQRSwgZGF0YSwgJnJlcGx5KTsKKworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworaW50IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR1YoImNoZWNrUmlnaHRzU3RhdHVzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KENIRUNLX1JJR0hUU19TVEFUVVMsIGRhdGEsICZyZXBseSk7CisKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIExPR1YoImNvbnN1bWVSaWdodHMiKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorCisgICAgZGF0YS53cml0ZUludDMyKGFjdGlvbik7CisgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PCBpbnQ+KHJlc2VydmUpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05TVU1FX1JJR0hUUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIExPR1YoInNldFBsYXliYWNrU3RhdHVzIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihwbGF5YmFja1N0YXR1cyk7CisgICAgZGF0YS53cml0ZUludDMyKHBvc2l0aW9uKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUExBWUJBQ0tfU1RBVFVTLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworYm9vbCBCcERybU1hbmFnZXJTZXJ2aWNlOjp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIExPR1YoInZhbGlkYXRlQWN0aW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KHBhdGgpOworICAgIGRhdGEud3JpdGVJbnQzMihhY3Rpb24pOworICAgIGRhdGEud3JpdGVJbnQzMihkZXNjcmlwdGlvbi5vdXRwdXRUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVzY3JpcHRpb24uY29uZmlndXJhdGlvbik7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoVkFMSURBVEVfQUNUSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR1YoInJlbW92ZVJpZ2h0cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChwYXRoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfUklHSFRTLCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIExPR1YoInJlbW92ZUFsbFJpZ2h0cyIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQUxMX1JJR0hUUywgZGF0YSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Cit9CisKK2ludCBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIm9wZW5Db252ZXJ0U2Vzc2lvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9DT05WRVJUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIExPR1YoImNvbnZlcnREYXRhIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworICAgIGRhdGEud3JpdGVJbnQzMihjb252ZXJ0SWQpOworICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dERhdGEtPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShpbnB1dERhdGEtPmRhdGEsIGlucHV0RGF0YS0+bGVuZ3RoKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDT05WRVJUX0RBVEEsIGRhdGEsICZyZXBseSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAvL0ZpbGxpbmcgRFJNIENvbnZlcnRlZCBTdGF0dXMKKyAgICAgICAgY29uc3QgaW50IHN0YXR1c0NvZGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHJlcGx5LnJlYWRJbnQzMigpOworCisgICAgICAgIERybUJ1ZmZlciogY29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciogZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGNoYXJbYnVmZmVyU2l6ZV07CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnZlcnRlZERhdGEgPSBuZXcgRHJtQnVmZmVyKGRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgICAgIGRybUNvbnZlcnRlZFN0YXR1cyA9IG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoc3RhdHVzQ29kZSwgY29udmVydGVkRGF0YSwgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIExPR1YoImNsb3NlQ29udmVydFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZUludDMyKGNvbnZlcnRJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfQ09OVkVSVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworCisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgLy9GaWxsaW5nIERSTSBDb252ZXJ0ZWQgU3RhdHVzCisgICAgICAgIGNvbnN0IGludCBzdGF0dXNDb2RlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGEgPSBOVUxMOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2J1ZmZlclNpemVdOworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQoZGF0YSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb252ZXJ0ZWREYXRhID0gbmV3IERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBuZXcgRHJtQ29udmVydGVkU3RhdHVzKHN0YXR1c0NvZGUsIGNvbnZlcnRlZERhdGEsIG9mZnNldCk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgTE9HVigiR2V0IEFsbCBTdXBwb3J0IEluZm8iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FMTF9TVVBQT1JUX0lORk8sIGRhdGEsICZyZXBseSk7CisKKyAgICAvL0ZpbGxpbmcgRFJNIFN1cHBvcnQgSW5mbworICAgIGNvbnN0IGludCBhcnJheVNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBpZiAoMCA8IGFycmF5U2l6ZSkgeworICAgICAgICAqZHJtU3VwcG9ydEluZm9BcnJheSA9IG5ldyBEcm1TdXBwb3J0SW5mb1thcnJheVNpemVdOworCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheVNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvIGRybVN1cHBvcnRJbmZvOworCisgICAgICAgICAgICBjb25zdCBpbnQgZmlsZVN1ZmZpeFZlY3RvclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZVN1ZmZpeFZlY3RvclNpemU7ICsraSkgeworICAgICAgICAgICAgICAgIGRybVN1cHBvcnRJbmZvLmFkZEZpbGVTdWZmaXgocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludCBtaW1lVHlwZVZlY3RvclNpemUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVR5cGVWZWN0b3JTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBkcm1TdXBwb3J0SW5mby5hZGRNaW1lVHlwZShyZXBseS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHJtU3VwcG9ydEluZm8uc2V0RGVzY3JpcHRpb24ocmVwbHkucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICAoKmRybVN1cHBvcnRJbmZvQXJyYXkpW2luZGV4XSA9IGRybVN1cHBvcnRJbmZvOworICAgICAgICB9CisgICAgfQorICAgICpsZW5ndGggPSBhcnJheVNpemU7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitEZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIExPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKyAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOworICAgIGRhdGEud3JpdGVJbnQzMihvZmZzZXQpOworICAgIGRhdGEud3JpdGVJbnQzMihsZW5ndGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworCisgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgeworICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPm1pbWVUeXBlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPnN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIm5vIGRlY3J5cHRIYW5kbGUgaXMgZ2VuZXJhdGVkIGluIHNlcnZpY2Ugc2lkZSIpOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitEZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoU3RyaW5nOCh1cmkpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwgZGF0YSwgJnJlcGx5KTsKKworICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKKyAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5taW1lVHlwZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5zdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJubyBkZWNyeXB0SGFuZGxlIGlzIGdlbmVyYXRlZCBpbiBzZXJ2aWNlIHNpZGUiKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBMT0dWKCJjbG9zZURlY3J5cHRTZXNzaW9uIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBMT0dWKCJkZWxldGluZyBkZWNyeXB0SW5mbyIpOworICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7IGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR1YoImluaXRpYWxpemVEZWNyeXB0VW5pdCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRVbml0SWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGhlYWRlckluZm8tPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShoZWFkZXJJbmZvLT5kYXRhLCBoZWFkZXJJbmZvLT5sZW5ndGgpOworCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KElOSVRJQUxJWkVfREVDUllQVF9VTklULCBkYXRhLCAmcmVwbHkpOworICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgTE9HVigiZGVjcnlwdCIpOworICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgIGRhdGEud3JpdGVTdHJpbmc4KGRlY3J5cHRIYW5kbGUtPm1pbWVUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5zdGF0dXMpOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoSU5WQUxJRF9CVUZGRVJfTEVOR1RIKTsKKyAgICB9CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdFVuaXRJZCk7CisgICAgZGF0YS53cml0ZUludDMyKCgqZGVjQnVmZmVyKS0+bGVuZ3RoKTsKKworICAgIGRhdGEud3JpdGVJbnQzMihlbmNCdWZmZXItPmxlbmd0aCk7CisgICAgZGF0YS53cml0ZShlbmNCdWZmZXItPmRhdGEsIGVuY0J1ZmZlci0+bGVuZ3RoKTsKKworICAgIGlmIChOVUxMICE9IElWKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJVi0+bGVuZ3RoKTsKKyAgICAgICAgZGF0YS53cml0ZShJVi0+ZGF0YSwgSVYtPmxlbmd0aCk7CisgICAgfQorCisgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFQ1JZUFQsIGRhdGEsICZyZXBseSk7CisKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBMT0dWKCJSZXR1cm4gdmFsdWUgb2YgZGVjcnlwdCgpIGlzICVkIiwgc3RhdHVzKTsKKworICAgIGNvbnN0IGludCBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgKCpkZWNCdWZmZXIpLT5sZW5ndGggPSBzaXplOworICAgIHJlcGx5LnJlYWQoKHZvaWQgKikoKmRlY0J1ZmZlciktPmRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBMT0dWKCJmaW5hbGl6ZURlY3J5cHRVbml0Iik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworCisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOworCisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUpOworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPnN0YXR1cyk7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgeworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihJTlZBTElEX0JVRkZFUl9MRU5HVEgpOworICAgIH0KKworICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0VW5pdElkKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSU5BTElaRV9ERUNSWVBUX1VOSVQsIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitzc2l6ZV90IEJwRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpIHsKKyAgICBMT0dWKCJyZWFkIik7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGludCByZXN1bHQ7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CisKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICBkYXRhLndyaXRlU3RyaW5nOChkZWNyeXB0SGFuZGxlLT5taW1lVHlwZSk7CisgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdEhhbmRsZS0+c3RhdHVzKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKElOVkFMSURfQlVGRkVSX0xFTkdUSCk7CisgICAgfQorCisgICAgZGF0YS53cml0ZUludDMyKG51bUJ5dGVzKTsKKyAgICBkYXRhLndyaXRlSW50MzIob2Zmc2V0KTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChQUkVBRCwgZGF0YSwgJnJlcGx5KTsKKyAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICBpZiAoMCA8IHJlc3VsdCkgeworICAgICAgICByZXBseS5yZWFkKGJ1ZmZlciwgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKERybU1hbmFnZXJTZXJ2aWNlLCAiZHJtLklEcm1NYW5hZ2VyU2VydmljZSIpOworCitzdGF0dXNfdCBCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IHdpdGggY29kZSAlZCIsIGNvZGUpOworCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgY2FzZSBBRERfVU5JUVVFSUQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpBRERfVU5JUVVFSUQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICBpbnQgdW5pcXVlSWQgPSBhZGRVbmlxdWVJZChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIodW5pcXVlSWQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgUkVNT1ZFX1VOSVFVRUlEOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX1VOSVFVRUlEIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgcmVtb3ZlVW5pcXVlSWQoZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBBRERfQ0xJRU5UOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6QUREX0NMSUVOVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgIGFkZENsaWVudChkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFTU9WRV9DTElFTlQ6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpSRU1PVkVfQ0xJRU5UIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgcmVtb3ZlQ2xpZW50KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgU0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6U0VUX0RSTV9TRVJWSUNFX0xJU1RFTkVSIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiBkcm1TZXJ2aWNlTGlzdGVuZXIKKyAgICAgICAgICAgID0gaW50ZXJmYWNlX2Nhc3Q8SURybVNlcnZpY2VMaXN0ZW5lcj4gKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREcm1TZXJ2aWNlTGlzdGVuZXIodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIElOU1RBTExfRFJNX0VOR0lORToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOklOU1RBTExfRFJNX0VOR0lORSIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbERybUVuZ2luZShkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBHRVRfQ09OU1RSQUlOVFNfRlJPTV9DT05URU5UOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX0NPTlNUUkFJTlRTX0ZST01fQ09OVEVOVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBwYXRoID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIERybUNvbnN0cmFpbnRzKiBkcm1Db25zdHJhaW50cyA9IGdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCAmcGF0aCwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29uc3RyYWludHMpIHsKKyAgICAgICAgICAgIC8vRmlsbGluZyBEUk0gQ29uc3RyYWludHMgY29udGVudHMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUNvbnN0cmFpbnRzLT5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgRHJtQ29uc3RyYWludHM6OktleUl0ZXJhdG9yIGtleUl0ID0gZHJtQ29uc3RyYWludHMtPmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoa2V5SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChrZXkpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gZHJtQ29uc3RyYWludHMtPmdldEFzQnl0ZUFycmF5KCZrZXkpOworICAgICAgICAgICAgICAgIGludCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gc3RybGVuKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSh2YWx1ZSwgYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1Db25zdHJhaW50czsgZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX01FVEFEQVRBX0ZST01fQ09OVEVOVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9NRVRBREFUQV9GUk9NX0NPTlRFTlQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBEcm1NZXRhZGF0YSogZHJtTWV0YWRhdGEgPSBnZXRNZXRhZGF0YSh1bmlxdWVJZCwgJnBhdGgpOworICAgICAgICBpZiAoTlVMTCAhPSBkcm1NZXRhZGF0YSkgeworICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBNZXRhZGF0YSBjb250ZW50cworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtTWV0YWRhdGEtPmdldENvdW50KCkpOworCisgICAgICAgICAgICBEcm1NZXRhZGF0YTo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1NZXRhZGF0YS0+a2V5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleSA9IGtleUl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGtleSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSBkcm1NZXRhZGF0YS0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICAgICAgaW50IGJ1ZmZlclNpemUgPSAwOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBzdHJsZW4odmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSh2YWx1ZSwgYnVmZmVyU2l6ZSArIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZHJtTWV0YWRhdGE7IGRybU1ldGFkYXRhID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0FOX0hBTkRMRToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNBTl9IQU5ETEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggcGF0aCA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKworICAgICAgICBib29sIHJlc3VsdCA9IGNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBQUk9DRVNTX0RSTV9JTkZPOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UFJPQ0VTU19EUk1fSU5GTyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAvL0ZpbGxpbmcgRFJNIGluZm8KKyAgICAgICAgY29uc3QgaW50IGluZm9UeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjaGFyKiBidWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEcm1CdWZmZXIgZHJtQnVmZmVyKGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgICAgIERybUluZm8qIGRybUluZm8gPSBuZXcgRHJtSW5mbyhpbmZvVHlwZSwgZHJtQnVmZmVyLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5KGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlKGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgICAgICBkcm1JbmZvLT5wdXQoa2V5LCAodmFsdWUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgRHJtSW5mb1N0YXR1cyogZHJtSW5mb1N0YXR1cyA9IHByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvU3RhdHVzKSB7CisgICAgICAgICAgICAvL0ZpbGxpbmcgRFJNIEluZm8gU3RhdHVzIGNvbnRlbnRzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1JbmZvU3RhdHVzLT5zdGF0dXNDb2RlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUluZm9TdGF0dXMtPmluZm9UeXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtSW5mb1N0YXR1cy0+bWltZVR5cGUpOworCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1JbmZvU3RhdHVzLT5kcm1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGRybUJ1ZmZlciA9IGRybUluZm9TdGF0dXMtPmRybUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRybUJ1ZmZlci0+bGVuZ3RoOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIGlmICgwIDwgYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoZHJtQnVmZmVyLT5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGRybUJ1ZmZlci0+ZGF0YTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZHJtQnVmZmVyOyBkcm1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1JbmZvOyBkcm1JbmZvID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGRybUluZm9TdGF0dXM7IGRybUluZm9TdGF0dXMgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQUNRVUlSRV9EUk1fSU5GTzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkFDUVVJUkVfRFJNX0lORk8iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgLy9GaWxsaW5nIERSTSBpbmZvIFJlcXVlc3QKKyAgICAgICAgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0ID0gbmV3IERybUluZm9SZXF1ZXN0KGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisKKyAgICAgICAgY29uc3QgaW50IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzggdmFsdWUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgICAgIGRybUluZm9SZXF1ZXN0LT5wdXQoa2V5LCAodmFsdWUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgRHJtSW5mbyogZHJtSW5mbyA9IGFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtSW5mbykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERSTSBJbmZvCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIgZHJtQnVmZmVyID0gZHJtSW5mby0+Z2V0RGF0YSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtSW5mby0+Z2V0SW5mb1R5cGUoKSk7CisKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZHJtQnVmZmVyLmxlbmd0aDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlclNpemUpOworICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGRybUJ1ZmZlci5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtSW5mby0+Z2V0TWltZVR5cGUoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1JbmZvLT5nZXRDb3VudCgpKTsKKworICAgICAgICAgICAgRHJtSW5mbzo6S2V5SXRlcmF0b3Iga2V5SXQgPSBkcm1JbmZvLT5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoa2V5KTsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IHZhbHVlID0gZHJtSW5mby0+Z2V0KGtleSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOCgodmFsdWUgPT0gU3RyaW5nOCgiIikpID8gU3RyaW5nOCgiTlVMTCIpIDogdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZXRlIFtdIGRybUJ1ZmZlci5kYXRhOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBkcm1JbmZvUmVxdWVzdDsgZHJtSW5mb1JlcXVlc3QgPSBOVUxMOworICAgICAgICBkZWxldGUgZHJtSW5mbzsgZHJtSW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBTQVZFX1JJR0hUUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlNBVkVfUklHSFRTIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBEUk0gUmlnaHRzCisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgRHJtQnVmZmVyIGRybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOworCisgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhY2NvdW50SWQoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBzdWJzY3JpcHRpb25JZChkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICBjb25zdCBTdHJpbmc4IHJpZ2h0c1BhdGgoZGF0YS5yZWFkU3RyaW5nOCgpKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCBjb250ZW50UGF0aChkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIERybVJpZ2h0cyBkcm1SaWdodHMoZHJtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWltZVR5cGUgPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogbWltZVR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYWNjb3VudElkID09IFN0cmluZzgoIk5VTEwiKSkgPyBTdHJpbmc4KCIiKSA6IGFjY291bnRJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdWJzY3JpcHRpb25JZCA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiBzdWJzY3JpcHRpb25JZCkpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJpZ2h0c1BhdGggPT0gU3RyaW5nOCgiTlVMTCIpKSA/IFN0cmluZzgoIiIpIDogcmlnaHRzUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb250ZW50UGF0aCA9PSBTdHJpbmc4KCJOVUxMIikpID8gU3RyaW5nOCgiIikgOiBjb250ZW50UGF0aCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBHRVRfT1JJR0lOQUxfTUlNRVRZUEU6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpHRVRfT1JJR0lOQUxfTUlNRVRZUEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IFN0cmluZzggb3JpZ2luYWxNaW1lVHlwZSA9IGdldE9yaWdpbmFsTWltZVR5cGUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpKTsKKworICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KG9yaWdpbmFsTWltZVR5cGUpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgR0VUX0RSTV9PQkpFQ1RfVFlQRToKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkdFVF9EUk1fT0JKRUNUX1RZUEUiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCBkcm1PYmplY3RUeXBlCisgICAgICAgICAgICA9IGdldERybU9iamVjdFR5cGUoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybU9iamVjdFR5cGUpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0hFQ0tfUklHSFRTX1NUQVRVUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkNIRUNLX1JJR0hUU19TVEFUVVMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCByZXN1bHQKKyAgICAgICAgICAgID0gY2hlY2tSaWdodHNTdGF0dXMoZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkU3RyaW5nOCgpLCBkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ09OU1VNRV9SSUdIVFM6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDT05TVU1FX1JJR0hUUyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRBcGlUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLnN0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cworICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBkYXRhLnJlYWRJbnQzMigpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgU0VUX1BMQVlCQUNLX1NUQVRVUzoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlNFVF9QTEFZQkFDS19TVEFUVVMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKKyAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBWQUxJREFURV9BQ1RJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpWQUxJREFURV9BQ1RJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGJvb2wgcmVzdWx0ID0gdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uRGVzY3JpcHRpb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBSRU1PVkVfUklHSFRTOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX1JJR0hUUyIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlUmlnaHRzKGRhdGEucmVhZEludDMyKCksIGRhdGEucmVhZFN0cmluZzgoKSk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIFJFTU9WRV9BTExfUklHSFRTOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6UkVNT1ZFX0FMTF9SSUdIVFMiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZUFsbFJpZ2h0cyhkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgT1BFTl9DT05WRVJUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpPUEVOX0NPTlZFUlRfU0VTU0lPTiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IGNvbnZlcnRJZCA9IG9wZW5Db252ZXJ0U2Vzc2lvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRTdHJpbmc4KCkpOworCisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbnZlcnRJZCk7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBDT05WRVJUX0RBVEE6CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDT05WRVJUX0RBVEEiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IGludCBjb252ZXJ0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBpbnB1dCBkYXRhCisgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgRHJtQnVmZmVyKiBpbnB1dERhdGEgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgRHJtQ29udmVydGVkU3RhdHVzKiAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBjb252ZXJ0RGF0YSh1bmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworCisgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cykgeworICAgICAgICAgICAgLy9GaWxsaW5nIERybSBDb252ZXJ0ZWQgU3RzdHVzCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db252ZXJ0ZWRTdGF0dXMtPnN0YXR1c0NvZGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtQ29udmVydGVkU3RhdHVzLT5vZmZzZXQpOworCisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGEpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGEgPSBkcm1Db252ZXJ0ZWRTdGF0dXMtPmNvbnZlcnRlZERhdGE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJ1ZmZlclNpemUgPSBjb252ZXJ0ZWREYXRhLT5sZW5ndGg7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShjb252ZXJ0ZWREYXRhLT5kYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGNvbnZlcnRlZERhdGEtPmRhdGE7CisgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnZlcnRlZERhdGE7IGNvbnZlcnRlZERhdGEgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBpbnB1dERhdGE7IGlucHV0RGF0YSA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBkcm1Db252ZXJ0ZWRTdGF0dXM7IGRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBDTE9TRV9DT05WRVJUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpDTE9TRV9DT05WRVJUX1NFU1NJT04iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIERybUNvbnZlcnRlZFN0YXR1cyogICAgZHJtQ29udmVydGVkU3RhdHVzCisgICAgICAgICAgICA9IGNsb3NlQ29udmVydFNlc3Npb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gZHJtQ29udmVydGVkU3RhdHVzKSB7CisgICAgICAgICAgICAvL0ZpbGxpbmcgRHJtIENvbnZlcnRlZCBTdHN0dXMKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybUNvbnZlcnRlZFN0YXR1cy0+c3RhdHVzQ29kZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkcm1Db252ZXJ0ZWRTdGF0dXMtPm9mZnNldCk7CisKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGRybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YSkgeworICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogY29udmVydGVkRGF0YSA9IGRybUNvbnZlcnRlZFN0YXR1cy0+Y29udmVydGVkRGF0YTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGNvbnZlcnRlZERhdGEtPmxlbmd0aDsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGNvbnZlcnRlZERhdGEtPmRhdGEsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgW10gY29udmVydGVkRGF0YS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBkZWxldGUgY29udmVydGVkRGF0YTsgY29udmVydGVkRGF0YSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGRybUNvbnZlcnRlZFN0YXR1czsgZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEdFVF9BTExfU1VQUE9SVF9JTkZPOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6R0VUX0FMTF9TVVBQT1JUX0lORk8iKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBEcm1TdXBwb3J0SW5mbyogZHJtU3VwcG9ydEluZm9BcnJheSA9IE5VTEw7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsICZsZW5ndGgsICZkcm1TdXBwb3J0SW5mb0FycmF5KTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBEcm1TdXBwb3J0SW5mbyBkcm1TdXBwb3J0SW5mbyA9IGRybVN1cHBvcnRJbmZvQXJyYXlbaV07CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRybVN1cHBvcnRJbmZvLmdldEZpbGVTdWZmaXhDb3VudCgpKTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvOjpGaWxlU3VmZml4SXRlcmF0b3IgZmlsZVN1ZmZpeEl0CisgICAgICAgICAgICAgICAgPSBkcm1TdXBwb3J0SW5mby5nZXRGaWxlU3VmZml4SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChmaWxlU3VmZml4SXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChmaWxlU3VmZml4SXQubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHJtU3VwcG9ydEluZm8uZ2V0TWltZVR5cGVDb3VudCgpKTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvOjpNaW1lVHlwZUl0ZXJhdG9yIG1pbWVUeXBlSXQgPSBkcm1TdXBwb3J0SW5mby5nZXRNaW1lVHlwZUl0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAobWltZVR5cGVJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KG1pbWVUeXBlSXQubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZHJtU3VwcG9ydEluZm8uZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIGRybVN1cHBvcnRJbmZvQXJyYXk7IGRybVN1cHBvcnRJbmZvQXJyYXkgPSBOVUxMOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgT1BFTl9ERUNSWVBUX1NFU1NJT046CisgICAgeworICAgICAgICBMT0dWKCJCbkRybU1hbmFnZXJTZXJ2aWNlOjpvblRyYW5zYWN0IDpPUEVOX0RFQ1JZUFRfU0VTU0lPTiIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgY29uc3QgaW50IGZkID0gZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUKKyAgICAgICAgICAgID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGhhbmRsZS0+ZGVjcnlwdEluZm87IGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIE9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6T1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkkiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGNvbnN0IFN0cmluZzggdXJpID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpKTsKKworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoaGFuZGxlLT5taW1lVHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRBcGlUeXBlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+c3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZS0+ZGVjcnlwdEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlLT5kZWNyeXB0SW5mbzsgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJOVUxMIGRlY3J5cHRIYW5kbGUgaXMgcmV0dXJuZWQiKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgQ0xPU0VfREVDUllQVF9TRVNTSU9OOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6Q0xPU0VfREVDUllQVF9TRVNTSU9OIik7CisgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtTWFuYWdlclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKworICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS0+c3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gY2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIElOSVRJQUxJWkVfREVDUllQVF9VTklUOgorICAgIHsKKyAgICAgICAgTE9HVigiQm5Ecm1NYW5hZ2VyU2VydmljZTo6b25UcmFuc2FjdCA6SU5JVElBTElaRV9ERUNSWVBUX1VOSVQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgIC8vRmlsbGluZyBIZWFkZXIgaW5mbworICAgICAgICBjb25zdCBpbnQgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIERybUJ1ZmZlciogaGVhZGVySW5mbyA9IE5VTEw7CisgICAgICAgIGhlYWRlckluZm8gPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CisKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCisgICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisKKyAgICAgICAgZGVsZXRlIGhhbmRsZS5kZWNyeXB0SW5mbzsgaGFuZGxlLmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIGhlYWRlckluZm87IGhlYWRlckluZm8gPSBOVUxMOworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKworICAgIGNhc2UgREVDUllQVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkRFQ1JZUFQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IGRlY3J5cHRVbml0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBpbnQgZGVjQnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgY29uc3QgaW50IGVuY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBEcm1CdWZmZXIqIGVuY0J1ZmZlcgorICAgICAgICAgICAgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShlbmNCdWZmZXJTaXplKSwgZW5jQnVmZmVyU2l6ZSk7CisKKyAgICAgICAgY2hhciogYnVmZmVyID0gTlVMTDsKKyAgICAgICAgYnVmZmVyID0gbmV3IGNoYXJbZGVjQnVmZmVyU2l6ZV07CisgICAgICAgIERybUJ1ZmZlciogZGVjQnVmZmVyID0gbmV3IERybUJ1ZmZlcihidWZmZXIsIGRlY0J1ZmZlclNpemUpOworCisgICAgICAgIERybUJ1ZmZlciogSVYgPSBOVUxMOworICAgICAgICBpZiAoMCAhPSBkYXRhLmRhdGFBdmFpbCgpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaXZCdWZmZXJsZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgSVYgPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShpdkJ1ZmZlcmxlbmd0aCksIGl2QnVmZmVybGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cworICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCAmaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsICZkZWNCdWZmZXIsIElWKTsKKworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGNvbnN0IGludCBzaXplID0gZGVjQnVmZmVyLT5sZW5ndGg7CisgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICByZXBseS0+d3JpdGUoZGVjQnVmZmVyLT5kYXRhLCBzaXplKTsKKworICAgICAgICBkZWxldGUgaGFuZGxlLmRlY3J5cHRJbmZvOyBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworICAgICAgICBkZWxldGUgZW5jQnVmZmVyOyBlbmNCdWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgZGVjQnVmZmVyOyBkZWNCdWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgW10gYnVmZmVyOyBidWZmZXIgPSBOVUxMOworICAgICAgICBkZWxldGUgSVY7IElWID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyAgICB9CisKKyAgICBjYXNlIEZJTkFMSVpFX0RFQ1JZUFRfVU5JVDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOkZJTkFMSVpFX0RFQ1JZUFRfVU5JVCIpOworICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisKKyAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5taW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgaGFuZGxlLmRlY3J5cHRBcGlUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaGFuZGxlLnN0YXR1cyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisKKyAgICAgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGlmIChJTlZBTElEX0JVRkZFUl9MRU5HVEggIT0gYnVmZmVyTGVuZ3RoKSB7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKKyAgICAgICAgICAgIGhhbmRsZS5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCA9IGJ1ZmZlckxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgY2FzZSBQUkVBRDoKKyAgICB7CisgICAgICAgIExPR1YoIkJuRHJtTWFuYWdlclNlcnZpY2U6Om9uVHJhbnNhY3QgOlJFQUQiKTsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1NYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOworCisgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0SWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUubWltZVR5cGUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CisgICAgICAgIGhhbmRsZS5kZWNyeXB0QXBpVHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgIGhhbmRsZS5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8gPSBOVUxMOworCisgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBpZiAoSU5WQUxJRF9CVUZGRVJfTEVOR1RIICE9IGJ1ZmZlckxlbmd0aCkgeworICAgICAgICAgICAgaGFuZGxlLmRlY3J5cHRJbmZvID0gbmV3IERlY3J5cHRJbmZvKCk7CisgICAgICAgICAgICBoYW5kbGUuZGVjcnlwdEluZm8tPmRlY3J5cHRCdWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgbnVtQnl0ZXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjaGFyKiBidWZmZXIgPSBuZXcgY2hhcltudW1CeXRlc107CisKKyAgICAgICAgY29uc3Qgb2ZmX3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCAmaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICBpZiAoMCA8IHJlc3VsdCkgeworICAgICAgICAgICAgcmVwbHktPndyaXRlKGJ1ZmZlciwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZSBoYW5kbGUuZGVjcnlwdEluZm87IGhhbmRsZS5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgICAgIGRlbGV0ZSBbXSBidWZmZXIsIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vSURybVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9kcm0vY29tbW9uL0lEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWVhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vY29tbW9uL0lEcm1TZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0dXNfdCBCcERybVNlcnZpY2VMaXN0ZW5lcjo6bm90aWZ5KGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisKKyAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybVNlcnZpY2VMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQuZ2V0VW5pcXVlSWQoKSk7CisgICAgZGF0YS53cml0ZUludDMyKGV2ZW50LmdldFR5cGUoKSk7CisgICAgZGF0YS53cml0ZVN0cmluZzgoZXZlbnQuZ2V0TWVzc2FnZSgpKTsKKworICAgIHJlbW90ZSgpLT50cmFuc2FjdChOT1RJRlksIGRhdGEsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworfQorCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRHJtU2VydmljZUxpc3RlbmVyLCAiZHJtLklEcm1TZXJ2aWNlTGlzdGVuZXIiKTsKKworc3RhdHVzX3QgQm5Ecm1TZXJ2aWNlTGlzdGVuZXI6Om9uVHJhbnNhY3QoCisgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgTk9USUZZOgorICAgIHsKKyAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm1TZXJ2aWNlTGlzdGVuZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgaW50IHR5cGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBtZXNzYWdlID0gZGF0YS5yZWFkU3RyaW5nOCgpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG5vdGlmeShEcm1JbmZvRXZlbnQodW5pcXVlSWQsIHR5cGUsIG1lc3NhZ2UpKTsKKyAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKworICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9SZWFkV3JpdGVVdGlscy5jcHAgYi9kcm0vY29tbW9uL1JlYWRXcml0ZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2NvbW1vbi9SZWFkV3JpdGVVdGlscy5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlYWRXcml0ZVV0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8UmVhZFdyaXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgRkFJTFVSRSAtMQorCitTdHJpbmc4IFJlYWRXcml0ZVV0aWxzOjpyZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJyIik7CisKKyAgICBTdHJpbmc4IHN0cmluZygiIik7CisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisgICAgICAgIHN0cnVjdCBzdGF0IHNiOworCisgICAgICAgIGlmIChmc3RhdChmZCwgJnNiKSA9PSAwICYmIHNiLnN0X3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gc2Iuc3Rfc2l6ZTsKKyAgICAgICAgICAgIGNoYXIqIGJ5dGVzID0gbmV3IGNoYXJbbGVuZ3RoXTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gcmVhZChmZCwgKHZvaWQqKSBieXRlcywgbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoYnl0ZXMsIGxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RyaW5nOworfQorCitpbnQgUmVhZFdyaXRlVXRpbHM6OnJlYWRCeXRlcyhjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCwgY2hhcioqIGJ1ZmZlcikgeworICAgIEZJTEUqIGZpbGUgPSBOVUxMOworICAgIGZpbGUgPSBmb3BlbihmaWxlUGF0aC5zdHJpbmcoKSwgInIiKTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChOVUxMICE9IGZpbGUpIHsKKyAgICAgICAgaW50IGZkID0gZmlsZW5vKGZpbGUpOworICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKworICAgICAgICBpZiAoZnN0YXQoZmQsICZzYikgPT0gMCAmJiBzYi5zdF9zaXplID4gMCkgeworICAgICAgICAgICAgbGVuZ3RoID0gc2Iuc3Rfc2l6ZTsKKyAgICAgICAgICAgICpidWZmZXIgPSBuZXcgY2hhcltsZW5ndGhdOworICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSByZWFkKGZkLCAodm9pZCopICpidWZmZXIsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBGQUlMVVJFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKwordm9pZCBSZWFkV3JpdGVVdGlsczo6d3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJ3KyIpOworCisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisKKyAgICAgICAgaW50IHNpemUgPSBkYXRhLnNpemUoKTsKKyAgICAgICAgaWYgKEZBSUxVUkUgIT0gZnRydW5jYXRlKGZkLCBzaXplKSkgeworICAgICAgICAgICAgaWYgKHNpemUgIT0gd3JpdGUoZmQsIGRhdGEuc3RyaW5nKCksIHNpemUpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHdyaXRlIHRoZSBkYXRhIHRvOiAlcyIsIGZpbGVQYXRoLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorfQorCit2b2lkIFJlYWRXcml0ZVV0aWxzOjphcHBlbmRUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpIHsKKyAgICBGSUxFKiBmaWxlID0gTlVMTDsKKyAgICBmaWxlID0gZm9wZW4oZmlsZVBhdGguc3RyaW5nKCksICJhKyIpOworCisgICAgaWYgKE5VTEwgIT0gZmlsZSkgeworICAgICAgICBpbnQgZmQgPSBmaWxlbm8oZmlsZSk7CisKKyAgICAgICAgaW50IHNpemUgPSBkYXRhLnNpemUoKTsKKyAgICAgICAgaWYgKHNpemUgIT0gd3JpdGUoZmQsIGRhdGEuc3RyaW5nKCksIHNpemUpKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gd3JpdGUgdGhlIGRhdGEgdG86ICVzIiwgZmlsZVBhdGguc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tayBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGYyZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgbWFpbl9kcm1zZXJ2ZXIuY3BwIFwKKyAgICBEcm1NYW5hZ2VyLmNwcCBcCisgICAgRHJtTWFuYWdlclNlcnZpY2UuY3BwIFwKKyAgICBTdHJpbmdUb2tlbml6ZXIuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJiaW5kZXIKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorIExPQ0FMX0xETElCUyArPSAtbGRsCitlbHNlCisgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJkcm1mcmFtZXdvcmtjb21tb24KKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUKKworTE9DQUxfTU9EVUxFOj0gZHJtc2VydmVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlkZjFjOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTAsMCArMSw1NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybU1hbmFnZXIoTmF0aXZlKSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKyNpbmNsdWRlIDxkcm0vRHJtUmlnaHRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybUNvbnN0cmFpbnRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8ZHJtL0RybUluZm9TdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8SURybUVuZ2luZS5oPgorCisjaW5jbHVkZSAiRHJtTWFuYWdlci5oIgorI2luY2x1ZGUgIlJlYWRXcml0ZVV0aWxzLmgiCisKKyNkZWZpbmUgREVDUllQVF9GSUxFX0VSUk9SIC0xCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitWZWN0b3I8aW50PiBEcm1NYW5hZ2VyOjptVW5pcXVlSWRWZWN0b3I7Citjb25zdCBTdHJpbmc4IERybU1hbmFnZXI6OkVNUFRZX1NUUklORygiIik7CisKK0RybU1hbmFnZXI6OkRybU1hbmFnZXIoKSA6CisgICAgbURlY3J5cHRTZXNzaW9uSWQoMCksCisgICAgbUNvbnZlcnRJZCgwKSB7CisKK30KKworRHJtTWFuYWdlcjo6fkRybU1hbmFnZXIoKSB7CisKK30KKworaW50IERybU1hbmFnZXI6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIGlmICgwID09IHVuaXF1ZUlkKSB7CisgICAgICAgIGludCB0ZW1wID0gMDsKKyAgICAgICAgYm9vbCBmb3VuZFVuaXF1ZUlkID0gZmFsc2U7CisgICAgICAgIHNyYW5kKHRpbWUoTlVMTCkpOworCisgICAgICAgIHdoaWxlICghZm91bmRVbmlxdWVJZCkgeworICAgICAgICAgICAgY29uc3QgaW50IHNpemUgPSBtVW5pcXVlSWRWZWN0b3Iuc2l6ZSgpOworICAgICAgICAgICAgdGVtcCA9IHJhbmQoKSAlIDEwMDsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoOyBpbmRleCA8IHNpemU7ICsraW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAobVVuaXF1ZUlkVmVjdG9yLml0ZW1BdChpbmRleCkgPT0gdGVtcCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZFVuaXF1ZUlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgZm91bmRVbmlxdWVJZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5pcXVlSWQgPSB0ZW1wOworICAgIH0KKyAgICBtVW5pcXVlSWRWZWN0b3IucHVzaCh1bmlxdWVJZCk7CisgICAgcmV0dXJuIHVuaXF1ZUlkOworfQorCit2b2lkIERybU1hbmFnZXI6OnJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbVVuaXF1ZUlkVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh1bmlxdWVJZCA9PSBtVW5pcXVlSWRWZWN0b3IuaXRlbUF0KGkpKSB7CisgICAgICAgICAgICBtVW5pcXVlSWRWZWN0b3IucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6bG9hZFBsdWdJbnMoKSB7CisgICAgU3RyaW5nOCBwbHVnaW5EaXJQYXRoKCIvc3lzdGVtL2xpYi9kcm0vcGx1Z2lucy9uYXRpdmUiKTsKKyAgICByZXR1cm4gbG9hZFBsdWdJbnMocGx1Z2luRGlyUGF0aCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmxvYWRQbHVnSW5zKGNvbnN0IFN0cmluZzgmIHBsdWdJbkRpclBhdGgpIHsKKyAgICBpZiAobVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgbVBsdWdJbk1hbmFnZXIubG9hZFBsdWdJbnMocGx1Z0luRGlyUGF0aCk7CisgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5QYXRoTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBsdWdJblBhdGhMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmc4IHBsdWdJblBhdGggPSBwbHVnSW5QYXRoTGlzdFtpXTsKKyAgICAgICAgICAgIERybVN1cHBvcnRJbmZvKiBpbmZvID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJblBhdGgpLmdldFN1cHBvcnRJbmZvKDApOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gaW5mbykgeworICAgICAgICAgICAgICAgIG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuYWRkKCppbmZvLCBwbHVnSW5QYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjp1bmxvYWRQbHVnSW5zKCkgeworICAgIG1Db252ZXJ0U2Vzc2lvbk1hcC5jbGVhcigpOworICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5jbGVhcigpOworICAgIG1QbHVnSW5NYW5hZ2VyLnVubG9hZFBsdWdJbnMoKTsKKyAgICBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLmNsZWFyKCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0RHJtU2VydmljZUxpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiYgZHJtU2VydmljZUxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoTlVMTCAhPSBkcm1TZXJ2aWNlTGlzdGVuZXIuZ2V0KCkpIHsKKyAgICAgICAgbVNlcnZpY2VMaXN0ZW5lcnMuYWRkKHVuaXF1ZUlkLCBkcm1TZXJ2aWNlTGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXJ2aWNlTGlzdGVuZXJzLnJlbW92ZUl0ZW0odW5pcXVlSWQpOworICAgIH0KKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCit2b2lkIERybU1hbmFnZXI6OmFkZENsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBpZiAoIW1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCkpOworICAgICAgICAgICAgckRybUVuZ2luZS5pbml0aWFsaXplKHVuaXF1ZUlkKTsKKyAgICAgICAgICAgIHJEcm1FbmdpbmUuc2V0T25JbmZvTGlzdGVuZXIodW5pcXVlSWQsIHRoaXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERybU1hbmFnZXI6OnJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZExpc3QuaXRlbUF0KGluZGV4KSk7CisgICAgICAgIHJEcm1FbmdpbmUudGVybWluYXRlKHVuaXF1ZUlkKTsKKyAgICB9Cit9CisKK0RybUNvbnN0cmFpbnRzKiBEcm1NYW5hZ2VyOjpnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgKnBhdGgpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworRHJtTWV0YWRhdGEqIERybU1hbmFnZXI6OmdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCAqcGF0aCk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuZ2V0TWV0YWRhdGEodW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6aW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGFic29sdXRlUGF0aCkgeworICAgIG1QbHVnSW5NYW5hZ2VyLmxvYWRQbHVnSW4oYWJzb2x1dGVQYXRoKTsKKworICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4oYWJzb2x1dGVQYXRoKTsKKyAgICByRHJtRW5naW5lLmluaXRpYWxpemUodW5pcXVlSWQpOworICAgIHJEcm1FbmdpbmUuc2V0T25JbmZvTGlzdGVuZXIodW5pcXVlSWQsIHRoaXMpOworCisgICAgRHJtU3VwcG9ydEluZm8qIGluZm8gPSByRHJtRW5naW5lLmdldFN1cHBvcnRJbmZvKDApOworICAgIG1TdXBwb3J0SW5mb1RvUGx1Z0luSWRNYXAuYWRkKCppbmZvLCBhYnNvbHV0ZVBhdGgpOworCisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYm9vbCBEcm1NYW5hZ2VyOjpjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChtaW1lVHlwZSk7CisgICAgYm9vbCByZXN1bHQgPSAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSA/IHRydWUgOiBmYWxzZTsKKworICAgIGlmICgwIDwgcGF0aC5sZW5ndGgoKSkgeworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUuY2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRHJtSW5mb1N0YXR1cyogRHJtTWFuYWdlcjo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKGRybUluZm8tPmdldE1pbWVUeXBlKCkpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLnByb2Nlc3NEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgRHJtTWFuYWdlcjo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBsdWdJblBhdGhMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luUGF0aExpc3RbaV0pOworICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCk7CisKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRHJtSW5mbyogRHJtTWFuYWdlcjo6YWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWQoZHJtSW5mb1JlcXVlc3QtPmdldE1pbWVUeXBlKCkpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChkcm1SaWdodHMuZ2V0TWltZVR5cGUoKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5zYXZlUmlnaHRzKHVuaXF1ZUlkLCBkcm1SaWdodHMsIHJpZ2h0c1BhdGgsIGNvbnRlbnRQYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworICAgICAgICByZXR1cm4gckRybUVuZ2luZS5nZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIEVNUFRZX1NUUklORzsKK30KKworaW50IERybU1hbmFnZXI6OmdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGNvbnN0IFN0cmluZzggcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZCh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLmdldERybU9iamVjdFR5cGUodW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKKyAgICB9CisgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OlVOS05PV047Cit9CisKK2ludCBEcm1NYW5hZ2VyOjpjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBjb25zdCBTdHJpbmc4IHBsdWdJbklkID0gZ2V0U3VwcG9ydGVkUGx1Z0luSWRGcm9tUGF0aCh1bmlxdWVJZCwgcGF0aCk7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwbHVnSW5JZCkgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgcmV0dXJuIHJEcm1FbmdpbmUuY2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgfQorICAgIHJldHVybiBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjb25zdW1lUmlnaHRzKAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgSURybUVuZ2luZSogZHJtRW5naW5lID0gbURlY3J5cHRTZXNzaW9uTWFwLnZhbHVlRm9yKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIHJlc3VsdCA9IGRybUVuZ2luZS0+Y29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6c2V0UGxheWJhY2tTdGF0dXMoCisgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPnNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIERybU1hbmFnZXI6OnZhbGlkYXRlQWN0aW9uKAorICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsIHBhdGgpOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJldHVybiByRHJtRW5naW5lLnZhbGlkYXRlQWN0aW9uKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24sIGRlc2NyaXB0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpyZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgodW5pcXVlSWQsIHBhdGgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGx1Z0luSWQpIHsKKyAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUucmVtb3ZlUmlnaHRzKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpKTsKKyAgICAgICAgcmVzdWx0ID0gckRybUVuZ2luZS5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOworICAgICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IERybU1hbmFnZXI6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgaW50IGNvbnZlcnRJZCA9IC0xOworCisgICAgY29uc3QgU3RyaW5nOCBwbHVnSW5JZCA9IGdldFN1cHBvcnRlZFBsdWdJbklkKG1pbWVUeXBlKTsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBsdWdJbklkKSB7CisgICAgICAgIElEcm1FbmdpbmUmIHJEcm1FbmdpbmUgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luSWQpOworCisgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gckRybUVuZ2luZS5vcGVuQ29udmVydFNlc3Npb24odW5pcXVlSWQsIG1Db252ZXJ0SWQgKyAxKSkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db252ZXJ0TG9jayk7CisgICAgICAgICAgICArK21Db252ZXJ0SWQ7CisgICAgICAgICAgICBjb252ZXJ0SWQgPSBtQ29udmVydElkOworICAgICAgICAgICAgbUNvbnZlcnRTZXNzaW9uTWFwLmFkZChjb252ZXJ0SWQsICZyRHJtRW5naW5lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29udmVydElkOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXI6OmNvbnZlcnREYXRhKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIERybUNvbnZlcnRlZFN0YXR1cyAqZHJtQ29udmVydGVkU3RhdHVzID0gTlVMTDsKKworICAgIGlmIChtQ29udmVydFNlc3Npb25NYXAuaW5kZXhPZktleShjb252ZXJ0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1Db252ZXJ0U2Vzc2lvbk1hcC52YWx1ZUZvcihjb252ZXJ0SWQpOworICAgICAgICBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBkcm1FbmdpbmUtPmNvbnZlcnREYXRhKHVuaXF1ZUlkLCBjb252ZXJ0SWQsIGlucHV0RGF0YSk7CisgICAgfQorICAgIHJldHVybiBkcm1Db252ZXJ0ZWRTdGF0dXM7Cit9CisKK0RybUNvbnZlcnRlZFN0YXR1cyogRHJtTWFuYWdlcjo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMgKmRybUNvbnZlcnRlZFN0YXR1cyA9IE5VTEw7CisKKyAgICBpZiAobUNvbnZlcnRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoY29udmVydElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtQ29udmVydFNlc3Npb25NYXAudmFsdWVGb3IoY29udmVydElkKTsKKyAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZHJtRW5naW5lLT5jbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOworICAgICAgICBtQ29udmVydFNlc3Npb25NYXAucmVtb3ZlSXRlbShjb252ZXJ0SWQpOworICAgIH0KKyAgICByZXR1cm4gZHJtQ29udmVydGVkU3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpnZXRBbGxTdXBwb3J0SW5mbygKKyAgICAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJblBhdGhMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisgICAgaW50IHNpemUgPSBwbHVnSW5QYXRoTGlzdC5zaXplKCk7CisgICAgaW50IHZhbGlkUGx1Z2lucyA9IDA7CisKKyAgICBpZiAoMCA8IHNpemUpIHsKKyAgICAgICAgVmVjdG9yPERybVN1cHBvcnRJbmZvPiBkcm1TdXBwb3J0SW5mb0xpc3Q7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIFN0cmluZzggcGx1Z0luUGF0aCA9IHBsdWdJblBhdGhMaXN0W2ldOworICAgICAgICAgICAgRHJtU3VwcG9ydEluZm8qIGRybVN1cHBvcnRJbmZvCisgICAgICAgICAgICAgICAgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW4ocGx1Z0luUGF0aCkuZ2V0U3VwcG9ydEluZm8oMCk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBkcm1TdXBwb3J0SW5mbykgeworICAgICAgICAgICAgICAgIGRybVN1cHBvcnRJbmZvTGlzdC5hZGQoKmRybVN1cHBvcnRJbmZvKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZHJtU3VwcG9ydEluZm87IGRybVN1cHBvcnRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbGlkUGx1Z2lucyA9IGRybVN1cHBvcnRJbmZvTGlzdC5zaXplKCk7CisgICAgICAgIGlmICgwIDwgdmFsaWRQbHVnaW5zKSB7CisgICAgICAgICAgICAqZHJtU3VwcG9ydEluZm9BcnJheSA9IG5ldyBEcm1TdXBwb3J0SW5mb1t2YWxpZFBsdWdpbnNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxpZFBsdWdpbnM7ICsraSkgeworICAgICAgICAgICAgICAgICgqZHJtU3VwcG9ydEluZm9BcnJheSlbaV0gPSBkcm1TdXBwb3J0SW5mb0xpc3RbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKmxlbmd0aCA9IHZhbGlkUGx1Z2luczsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKKyAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5JZCA9IHBsdWdJbklkTGlzdC5pdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgSURybUVuZ2luZSYgckRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihwbHVnSW5JZCk7CisgICAgICAgICAgICByZXN1bHQgPSByRHJtRW5naW5lLm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICsrbURlY3J5cHRTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgbURlY3J5cHRTZXNzaW9uTWFwLmFkZChtRGVjcnlwdFNlc3Npb25JZCwgJnJEcm1FbmdpbmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7CisgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIExPR0UoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKKworICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOworCisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBTdHJpbmc4IHBsdWdJbklkID0gcGx1Z0luSWRMaXN0Lml0ZW1BdChpbmRleCk7CisgICAgICAgICAgICBJRHJtRW5naW5lJiByRHJtRW5naW5lID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luKHBsdWdJbklkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJEcm1FbmdpbmUub3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBoYW5kbGUsIHVyaSk7CisKKyAgICAgICAgICAgIGlmIChEUk1fTk9fRVJST1IgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgKyttRGVjcnlwdFNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAuYWRkKG1EZWNyeXB0U2Vzc2lvbklkLCAmckRybUVuZ2luZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKKyAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgTE9HRSgiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5yZW1vdmVJdGVtKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlcjo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXI6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5kZWNyeXB0KAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgc3NpemVfdCByZXN1bHQgPSBERUNSWVBUX0ZJTEVfRVJST1I7CisKKyAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5wcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyOjpnZXRTdXBwb3J0ZWRQbHVnSW5JZCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBTdHJpbmc4IHBsdWdJbklkKCIiKTsKKworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKKyAgICAgICAgcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZChtaW1lVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGx1Z0luSWQgPSBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKHVuaXF1ZUlkLCBwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHBsdWdJbklkOworfQorCitTdHJpbmc4IERybU1hbmFnZXI6OmdldFN1cHBvcnRlZFBsdWdJbklkKGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CisKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CisKKyAgICAgICAgICAgIGlmIChkcm1TdXBwb3J0SW5mby5pc1N1cHBvcnRlZE1pbWVUeXBlKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgIHBsdWdJbklkID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC52YWx1ZUZvcihkcm1TdXBwb3J0SW5mbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBsdWdJbklkOworfQorCitTdHJpbmc4IERybU1hbmFnZXI6OmdldFN1cHBvcnRlZFBsdWdJbklkRnJvbVBhdGgoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgU3RyaW5nOCBwbHVnSW5JZCgiIik7CisgICAgY29uc3QgU3RyaW5nOCBmaWxlU3VmZml4ID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpbmRleCA9IDA7IGluZGV4IDwgbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvID0gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcC5rZXlBdChpbmRleCk7CisKKyAgICAgICAgaWYgKGRybVN1cHBvcnRJbmZvLmlzU3VwcG9ydGVkRmlsZVN1ZmZpeChmaWxlU3VmZml4KSkgeworICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBtU3VwcG9ydEluZm9Ub1BsdWdJbklkTWFwLnZhbHVlRm9yKGRybVN1cHBvcnRJbmZvKTsKKyAgICAgICAgICAgIElEcm1FbmdpbmUmIGRybUVuZ2luZSA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbihrZXkpOworCisgICAgICAgICAgICBpZiAoZHJtRW5naW5lLmNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCkpIHsKKyAgICAgICAgICAgICAgICBwbHVnSW5JZCA9IGtleTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGx1Z0luSWQ7Cit9CisKK3ZvaWQgRHJtTWFuYWdlcjo6b25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAodW5zaWduZWQgaW50IGluZGV4ID0gMDsgaW5kZXggPCBtU2VydmljZUxpc3RlbmVycy5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaW50IHVuaXF1ZUlkID0gbVNlcnZpY2VMaXN0ZW5lcnMua2V5QXQoaW5kZXgpOworCisgICAgICAgIGlmICh1bmlxdWVJZCA9PSBldmVudC5nZXRVbmlxdWVJZCgpKSB7CisgICAgICAgICAgICBzcDxJRHJtU2VydmljZUxpc3RlbmVyPiBzZXJ2aWNlTGlzdGVuZXIgPSBtU2VydmljZUxpc3RlbmVycy52YWx1ZUZvcih1bmlxdWVJZCk7CisgICAgICAgICAgICBzZXJ2aWNlTGlzdGVuZXItPm5vdGlmeShldmVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjZmE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1NYW5hZ2VyU2VydmljZShOYXRpdmUpIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJEcm1NYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgIkRybU1hbmFnZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBWZWN0b3I8dWlkX3Q+IHRydXN0ZWRVaWRzOworCitzdGF0aWMgYm9vbCBpc1Byb3RlY3RlZENhbGxBbGxvd2VkKCkgeworICAgIC8vIFRPRE8KKyAgICAvLyBGb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaXMganVzdCBmb3IgcmVmZXJlbmNlLgorICAgIC8vIEVhY2ggT0VNIG1hbnVmYWN0dXJlciBzaG91bGQgaW1wbGVtZW50L3JlcGxhY2Ugd2l0aCB0aGVpciBvd24gc29sdXRpb25zLgorICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBJUENUaHJlYWRTdGF0ZSogaXBjU3RhdGUgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIHVpZF90IHVpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nVWlkKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHRydXN0ZWRVaWRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICh0cnVzdGVkVWlkc1tpXSA9PSB1aWQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKKyAgICBMT0dWKCJpbnN0YW50aWF0ZSIpOworICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKSk7CisKKyAgICBpZiAoMCA+PSB0cnVzdGVkVWlkcy5zaXplKCkpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAvLyBGb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaXMganVzdCBmb3IgcmVmZXJlbmNlLgorICAgICAgICAvLyBFYWNoIE9FTSBtYW51ZmFjdHVyZXIgc2hvdWxkIGltcGxlbWVudC9yZXBsYWNlIHdpdGggdGhlaXIgb3duIHNvbHV0aW9ucy4KKworICAgICAgICAvLyBBZGQgdHJ1c3RlZCB1aWRzIGhlcmUKKyAgICAgICAgdHJ1c3RlZFVpZHMucHVzaChBSURfTUVESUEpOworICAgIH0KK30KKworRHJtTWFuYWdlclNlcnZpY2U6OkRybU1hbmFnZXJTZXJ2aWNlKCkgOgorICAgICAgICBtRHJtTWFuYWdlcihOVUxMKSB7CisgICAgTE9HVigiY3JlYXRlZCIpOworICAgIG1Ecm1NYW5hZ2VyID0gbmV3IERybU1hbmFnZXIoKTsKKyAgICBtRHJtTWFuYWdlci0+bG9hZFBsdWdJbnMoKTsKK30KKworRHJtTWFuYWdlclNlcnZpY2U6On5Ecm1NYW5hZ2VyU2VydmljZSgpIHsKKyAgICBMT0dWKCJEZXN0cm95ZWQiKTsKKyAgICBtRHJtTWFuYWdlci0+dW5sb2FkUGx1Z0lucygpOworICAgIGRlbGV0ZSBtRHJtTWFuYWdlcjsgbURybU1hbmFnZXIgPSBOVUxMOworfQorCitpbnQgRHJtTWFuYWdlclNlcnZpY2U6OmFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlci0+YWRkVW5pcXVlSWQodW5pcXVlSWQpOworfQorCit2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpIHsKKyAgICBtRHJtTWFuYWdlci0+cmVtb3ZlVW5pcXVlSWQodW5pcXVlSWQpOworfQorCit2b2lkIERybU1hbmFnZXJTZXJ2aWNlOjphZGRDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgbURybU1hbmFnZXItPmFkZENsaWVudCh1bmlxdWVJZCk7Cit9CisKK3ZvaWQgRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpIHsKKyAgICBtRHJtTWFuYWdlci0+cmVtb3ZlQ2xpZW50KHVuaXF1ZUlkKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGRybVNlcnZpY2VMaXN0ZW5lcikgeworICAgIExPR1YoIkVudGVyaW5nIHNldERybVNlcnZpY2VMaXN0ZW5lciIpOworICAgIG1Ecm1NYW5hZ2VyLT5zZXREcm1TZXJ2aWNlTGlzdGVuZXIodW5pcXVlSWQsIGRybVNlcnZpY2VMaXN0ZW5lcik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgaW5zdGFsbERybUVuZ2luZSIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+aW5zdGFsbERybUVuZ2luZSh1bmlxdWVJZCwgZHJtRW5naW5lRmlsZSk7Cit9CisKK0RybUNvbnN0cmFpbnRzKiBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBMT0dWKCJFbnRlcmluZyBnZXRDb25zdHJhaW50cyBmcm9tIGNvbnRlbnQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitEcm1NZXRhZGF0YSogRHJtTWFuYWdlclNlcnZpY2U6OmdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIExPR1YoIkVudGVyaW5nIGdldE1ldGFkYXRhIGZyb20gY29udGVudCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0TWV0YWRhdGEodW5pcXVlSWQsIHBhdGgpOworfQorCitib29sIERybU1hbmFnZXJTZXJ2aWNlOjpjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIExPR1YoIkVudGVyaW5nIGNhbkhhbmRsZSIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK0RybUluZm9TdGF0dXMqIERybU1hbmFnZXJTZXJ2aWNlOjpwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICBMT0dWKCJFbnRlcmluZyBwcm9jZXNzRHJtSW5mbyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+cHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOworfQorCitEcm1JbmZvKiBEcm1NYW5hZ2VyU2VydmljZTo6YWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBhY3F1aXJlRHJtSW5mbyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+YWNxdWlyZURybUluZm8odW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnNhdmVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBzYXZlUmlnaHRzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5zYXZlUmlnaHRzKHVuaXF1ZUlkLCBkcm1SaWdodHMsIHJpZ2h0c1BhdGgsIGNvbnRlbnRQYXRoKTsKK30KKworU3RyaW5nOCBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBnZXRPcmlnaW5hbE1pbWVUeXBlIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRPcmlnaW5hbE1pbWVUeXBlKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworaW50IERybU1hbmFnZXJTZXJ2aWNlOjpnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZ2V0RHJtT2JqZWN0VHlwZSIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0RHJtT2JqZWN0VHlwZSh1bmlxdWVJZCwgcGF0aCwgbWltZVR5cGUpOworfQorCitpbnQgRHJtTWFuYWdlclNlcnZpY2U6OmNoZWNrUmlnaHRzU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY2hlY2tSaWdodHNTdGF0dXMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPmNoZWNrUmlnaHRzU3RhdHVzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY29uc3VtZVJpZ2h0cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIExPR1YoIkVudGVyaW5nIHNldFBsYXliYWNrU3RhdHVzIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5zZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6dmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBMT0dWKCJFbnRlcmluZyB2YWxpZGF0ZUFjdGlvbiIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+dmFsaWRhdGVBY3Rpb24odW5pcXVlSWQsIHBhdGgsIGFjdGlvbiwgZGVzY3JpcHRpb24pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR1YoIkVudGVyaW5nIHJlbW92ZVJpZ2h0cyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+cmVtb3ZlUmlnaHRzKHVuaXF1ZUlkLCBwYXRoKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OnJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dWKCJFbnRlcmluZyByZW1vdmVBbGxSaWdodHMiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnJlbW92ZUFsbFJpZ2h0cyh1bmlxdWVJZCk7Cit9CisKK2ludCBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBvcGVuQ29udmVydFNlc3Npb24iKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPm9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgbWltZVR5cGUpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXJTZXJ2aWNlOjpjb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjb252ZXJ0RGF0YSIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBjbG9zZUNvbnZlcnRTZXNzaW9uIik7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZUNvbnZlcnRTZXNzaW9uKHVuaXF1ZUlkLCBjb252ZXJ0SWQpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Z2V0QWxsU3VwcG9ydEluZm8oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBnZXRBbGxTdXBwb3J0SW5mbyIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIExPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKKyAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBtRHJtTWFuYWdlci0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIHdpdGggdXJpIik7CisgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gbURybU1hbmFnZXItPm9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgTE9HVigiRW50ZXJpbmcgY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIExPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZGVjcnlwdCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZGVjcnlwdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HVigiRW50ZXJpbmcgZmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7Cit9CisKK3NzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgTE9HVigiRW50ZXJpbmcgcHJlYWQiKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXItPnByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworfQorCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL1N0cmluZ1Rva2VuaXplci5jcHAgYi9kcm0vZHJtc2VydmVyL1N0cmluZ1Rva2VuaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMGEwMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1zZXJ2ZXIvU3RyaW5nVG9rZW5pemVyLmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN0cmluZ1Rva2VuaXplci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworU3RyaW5nVG9rZW5pemVyOjpTdHJpbmdUb2tlbml6ZXIoY29uc3QgU3RyaW5nOCYgc3RyaW5nLCBjb25zdCBTdHJpbmc4JiBkZWxpbWl0ZXIpIHsKKyAgICBzcGxpdFN0cmluZyhzdHJpbmcsIGRlbGltaXRlcik7Cit9CisKK3ZvaWQgU3RyaW5nVG9rZW5pemVyOjpzcGxpdFN0cmluZyhjb25zdCBTdHJpbmc4JiBzdHJpbmcsIGNvbnN0IFN0cmluZzgmIGRlbGltaXRlcikgeworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHBvc2l0aW9uID0gc3RyaW5nLmZpbmQoZGVsaW1pdGVyLnN0cmluZygpLCBpKTsKKyAgICAgICAgaWYgKHN0cmluZy5sZW5ndGgoKSAhPSBwb3NpdGlvbikgeworICAgICAgICAgICAgU3RyaW5nOCB0b2tlbihzdHJpbmcuc3RyaW5nKCkraSwgcG9zaXRpb24taSk7CisgICAgICAgICAgICBpZiAodG9rZW4ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBtU3RyaW5nVG9rZW5pemVyVmVjdG9yLnB1c2godG9rZW4pOworICAgICAgICAgICAgICAgIGkgPSBwb3NpdGlvbiArIGRlbGltaXRlci5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RyaW5nVG9rZW5pemVyVmVjdG9yLnB1c2goU3RyaW5nOChzdHJpbmcuc3RyaW5nKCkraSwgc3RyaW5nLmxlbmd0aCgpLWkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yIFN0cmluZ1Rva2VuaXplcjo6aXRlcmF0b3IoKSB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKHRoaXMpOworfQorCitTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yJiBpdGVyYXRvcikgOgorICAgIG1TdHJpbmdUb2tlbml6ZXIoaXRlcmF0b3IubVN0cmluZ1Rva2VuaXplciksCisgICAgbUluZGV4KGl0ZXJhdG9yLm1JbmRleCkgeworfQorCitTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yJiBTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yOjpvcGVyYXRvcj0oCisgICAgICAgICAgICBjb25zdCBTdHJpbmdUb2tlbml6ZXI6Okl0ZXJhdG9yJiBpdGVyYXRvcikgeworICAgIG1TdHJpbmdUb2tlbml6ZXIgPSBpdGVyYXRvci5tU3RyaW5nVG9rZW5pemVyOworICAgIG1JbmRleCA9IGl0ZXJhdG9yLm1JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgU3RyaW5nVG9rZW5pemVyOjpJdGVyYXRvcjo6aGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbUluZGV4IDwgbVN0cmluZ1Rva2VuaXplci0+bVN0cmluZ1Rva2VuaXplclZlY3Rvci5zaXplKCk7Cit9CisKK1N0cmluZzgmIFN0cmluZ1Rva2VuaXplcjo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgU3RyaW5nOCYgdmFsdWUgPSBtU3RyaW5nVG9rZW5pemVyLT5tU3RyaW5nVG9rZW5pemVyVmVjdG9yLmVkaXRJdGVtQXQobUluZGV4KTsKKyAgICBtSW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvbWFpbl9kcm1zZXJ2ZXIuY3BwIGIvZHJtL2RybXNlcnZlci9tYWluX2RybXNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxMDY0NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9kcm1zZXJ2ZXIvbWFpbl9kcm1zZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSA8RHJtTWFuYWdlclNlcnZpY2UuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBMT0dJKCJTZXJ2aWNlTWFuYWdlcjogJXAiLCBzbS5nZXQoKSk7CisgICAgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEzM2JhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBEcm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgXAorICAgIERybU1hbmFnZXJDbGllbnQuY3BwCisKK0xPQ0FMX01PRFVMRTo9IGxpYmRybWZyYW1ld29yaworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliYmluZGVyCisKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmRybWZyYW1ld29ya2NvbW1vbgorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50LmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMDBjMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgorCisjaW5jbHVkZSAiRHJtTWFuYWdlckNsaWVudEltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK0RybU1hbmFnZXJDbGllbnQ6OkRybU1hbmFnZXJDbGllbnQoKToKKyAgICAgICAgbVVuaXF1ZUlkKDApLCBtRHJtTWFuYWdlckNsaWVudEltcGwoTlVMTCkgeworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbCA9IERybU1hbmFnZXJDbGllbnRJbXBsOjpjcmVhdGUoJm1VbmlxdWVJZCk7CisgICAgbURybU1hbmFnZXJDbGllbnRJbXBsLT5hZGRDbGllbnQobVVuaXF1ZUlkKTsKK30KKworRHJtTWFuYWdlckNsaWVudDo6fkRybU1hbmFnZXJDbGllbnQoKSB7CisgICAgRHJtTWFuYWdlckNsaWVudEltcGw6OnJlbW92ZShtVW5pcXVlSWQpOworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cmVtb3ZlQ2xpZW50KG1VbmlxdWVJZCk7CisgICAgbURybU1hbmFnZXJDbGllbnRJbXBsLT5zZXRPbkluZm9MaXN0ZW5lcihtVW5pcXVlSWQsIE5VTEwpOworICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudEltcGw7IG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbCA9IE5VTEw7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNldE9uSW5mb0xpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEcm1NYW5hZ2VyQ2xpZW50OjpPbkluZm9MaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnNldE9uSW5mb0xpc3RlbmVyKG1VbmlxdWVJZCwgaW5mb0xpc3RlbmVyKTsKK30KKworRHJtQ29uc3RyYWludHMqIERybU1hbmFnZXJDbGllbnQ6OmdldENvbnN0cmFpbnRzKGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXRDb25zdHJhaW50cyhtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRNZXRhZGF0YShjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0TWV0YWRhdGEobVVuaXF1ZUlkLCBwYXRoKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50OjpjYW5IYW5kbGUoY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jYW5IYW5kbGUobVVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7Cit9CisKK0RybUluZm9TdGF0dXMqIERybU1hbmFnZXJDbGllbnQ6OnByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qIGRybUluZm8pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5wcm9jZXNzRHJtSW5mbyhtVW5pcXVlSWQsIGRybUluZm8pOworfQorCitEcm1JbmZvKiBEcm1NYW5hZ2VyQ2xpZW50OjphY3F1aXJlRHJtSW5mbyhjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5hY3F1aXJlRHJtSW5mbyhtVW5pcXVlSWQsIGRybUluZm9SZXF1ZXN0KTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6c2F2ZVJpZ2h0cygKKyAgICAgICAgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+c2F2ZVJpZ2h0cyhtVW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworfQorCitTdHJpbmc4IERybU1hbmFnZXJDbGllbnQ6OmdldE9yaWdpbmFsTWltZVR5cGUoY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmdldE9yaWdpbmFsTWltZVR5cGUobVVuaXF1ZUlkLCBwYXRoKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6OmdldERybU9iamVjdFR5cGUoY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5nZXREcm1PYmplY3RUeXBlKCBtVW5pcXVlSWQsIHBhdGgsIG1pbWVUeXBlKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6OmNoZWNrUmlnaHRzU3RhdHVzKGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5jaGVja1JpZ2h0c1N0YXR1cyhtVW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNvbnN1bWVSaWdodHMoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Y29uc3VtZVJpZ2h0cyhtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsCisgICAgICAgICAgICAtPnNldFBsYXliYWNrU3RhdHVzKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50Ojp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnZhbGlkYXRlQWN0aW9uKG1VbmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnJlbW92ZVJpZ2h0cyhjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+cmVtb3ZlUmlnaHRzKG1VbmlxdWVJZCwgcGF0aCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OnJlbW92ZUFsbFJpZ2h0cygpIHsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5yZW1vdmVBbGxSaWdodHMobVVuaXF1ZUlkKTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnQ6Om9wZW5Db252ZXJ0U2Vzc2lvbihjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5Db252ZXJ0U2Vzc2lvbihtVW5pcXVlSWQsIG1pbWVUeXBlKTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50Ojpjb252ZXJ0RGF0YShpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNvbnZlcnREYXRhKG1VbmlxdWVJZCwgY29udmVydElkLCBpbnB1dERhdGEpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybU1hbmFnZXJDbGllbnQ6OmNsb3NlQ29udmVydFNlc3Npb24oaW50IGNvbnZlcnRJZCkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNsb3NlQ29udmVydFNlc3Npb24obVVuaXF1ZUlkLCBjb252ZXJ0SWQpOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRBbGxTdXBwb3J0SW5mbyhpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+Z2V0QWxsU3VwcG9ydEluZm8obVVuaXF1ZUlkLCBsZW5ndGgsIGRybVN1cHBvcnRJbmZvQXJyYXkpOworfQorCitEZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyQ2xpZW50OjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50SW1wbC0+b3BlbkRlY3J5cHRTZXNzaW9uKG1VbmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKK30KKworRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlckNsaWVudDo6b3BlbkRlY3J5cHRTZXNzaW9uKGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPm9wZW5EZWNyeXB0U2Vzc2lvbihtVW5pcXVlSWQsIHVyaSk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmNsb3NlRGVjcnlwdFNlc3Npb24oRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmNsb3NlRGVjcnlwdFNlc3Npb24obVVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudDo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKKyAgICAgICAgICAgIG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmRlY3J5cHQoCisgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPmRlY3J5cHQoCisgICAgICAgICAgICBtVW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnQ6OmZpbmFsaXplRGVjcnlwdFVuaXQoRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJDbGllbnRJbXBsLT5maW5hbGl6ZURlY3J5cHRVbml0KG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7Cit9CisKK3NzaXplX3QgRHJtTWFuYWdlckNsaWVudDo6cHJlYWQoCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOworICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudEltcGwtPnByZWFkKG1VbmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWEzMTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRybU1hbmFnZXJDbGllbnRJbXBsKE5hdGl2ZSkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSAiRHJtTWFuYWdlckNsaWVudEltcGwuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgSU5WQUxJRF9WQUxVRSAtMQorCitNdXRleCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6bU11dGV4Oworc3A8SURybU1hbmFnZXJTZXJ2aWNlPiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6bURybU1hbmFnZXJTZXJ2aWNlOworY29uc3QgU3RyaW5nOCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6RU1QVFlfU1RSSU5HKCIiKTsKKworRHJtTWFuYWdlckNsaWVudEltcGwqIERybU1hbmFnZXJDbGllbnRJbXBsOjpjcmVhdGUoaW50KiBwVW5pcXVlSWQpIHsKKyAgICBpZiAoMCA9PSAqcFVuaXF1ZUlkKSB7CisgICAgICAgIGludCB1bmlxdWVJZCA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFkZFVuaXF1ZUlkKCpwVW5pcXVlSWQpOworICAgICAgICAqcFVuaXF1ZUlkID0gdW5pcXVlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkVW5pcXVlSWQoKnBVbmlxdWVJZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtTWFuYWdlckNsaWVudEltcGwoKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlKGludCB1bmlxdWVJZCkgeworICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnJlbW92ZVVuaXF1ZUlkKHVuaXF1ZUlkKTsKK30KKworY29uc3Qgc3A8SURybU1hbmFnZXJTZXJ2aWNlPiYgRHJtTWFuYWdlckNsaWVudEltcGw6OmdldERybU1hbmFnZXJTZXJ2aWNlKCkgeworICAgIG1NdXRleC5sb2NrKCk7CisgICAgaWYgKE5VTEwgPT0gbURybU1hbmFnZXJTZXJ2aWNlLmdldCgpKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSk7CisgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1coIkRybU1hbmFnZXJTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyByZXF0OworICAgICAgICAgICAgcmVxdC50dl9zZWMgID0gMDsKKyAgICAgICAgICAgIHJlcXQudHZfbnNlYyA9IDUwMDAwMDAwMDsgLy8wLjUgc2VjCisgICAgICAgICAgICBuYW5vc2xlZXAoJnJlcXQsIE5VTEwpOworICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICBtRHJtTWFuYWdlclNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJRHJtTWFuYWdlclNlcnZpY2U+KGJpbmRlcik7CisgICAgfQorICAgIG1NdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gbURybU1hbmFnZXJTZXJ2aWNlOworfQorCit2b2lkIERybU1hbmFnZXJDbGllbnRJbXBsOjphZGRDbGllbnQoaW50IHVuaXF1ZUlkKSB7CisgICAgZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+YWRkQ2xpZW50KHVuaXF1ZUlkKTsKK30KKwordm9pZCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCkgeworICAgIGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnJlbW92ZUNsaWVudCh1bmlxdWVJZCk7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1PbkluZm9MaXN0ZW5lciA9IGluZm9MaXN0ZW5lcjsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0RHJtU2VydmljZUxpc3RlbmVyKHVuaXF1ZUlkLAorICAgICAgICAgICAgKE5VTEwgIT0gaW5mb0xpc3RlbmVyLmdldCgpKSA/IHRoaXMgOiBOVUxMKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Omluc3RhbGxEcm1FbmdpbmUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBkcm1FbmdpbmVGaWxlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBkcm1FbmdpbmVGaWxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluc3RhbGxEcm1FbmdpbmUodW5pcXVlSWQsIGRybUVuZ2luZUZpbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitEcm1Db25zdHJhaW50cyogRHJtTWFuYWdlckNsaWVudEltcGw6OmdldENvbnN0cmFpbnRzKAorICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pIHsKKyAgICBEcm1Db25zdHJhaW50cyAqZHJtQ29uc3RyYWludHMgPSBOVUxMOworICAgIGlmICgoTlVMTCAhPSBwYXRoKSAmJiAoRU1QVFlfU1RSSU5HICE9ICpwYXRoKSkgeworICAgICAgICBkcm1Db25zdHJhaW50cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmdldENvbnN0cmFpbnRzKHVuaXF1ZUlkLCBwYXRoLCBhY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybU1ldGFkYXRhKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgRHJtTWV0YWRhdGEgKmRybU1ldGFkYXRhID0gTlVMTDsKKyAgICBpZiAoKE5VTEwgIT0gcGF0aCkgJiYgKEVNUFRZX1NUUklORyAhPSAqcGF0aCkpIHsKKyAgICAgICAgZHJtTWV0YWRhdGEgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXRNZXRhZGF0YSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBkcm1NZXRhZGF0YTsKK30KKworYm9vbCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBib29sIHJldENvZGUgPSBmYWxzZTsKKyAgICBpZiAoKEVNUFRZX1NUUklORyAhPSBwYXRoKSB8fCAoRU1QVFlfU1RSSU5HICE9IG1pbWVUeXBlKSkgeworICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCitEcm1JbmZvU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgRHJtSW5mb1N0YXR1cyAqZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisgICAgaWYgKE5VTEwgIT0gZHJtSW5mbykgeworICAgICAgICBkcm1JbmZvU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJvY2Vzc0RybUluZm8odW5pcXVlSWQsIGRybUluZm8pOworICAgIH0KKyAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKK30KKworRHJtSW5mbyogRHJtTWFuYWdlckNsaWVudEltcGw6OmFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KSB7CisgICAgRHJtSW5mbyogZHJtSW5mbyA9IE5VTEw7CisgICAgaWYgKE5VTEwgIT0gZHJtSW5mb1JlcXVlc3QpIHsKKyAgICAgICAgZHJtSW5mbyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmFjcXVpcmVEcm1JbmZvKHVuaXF1ZUlkLCBkcm1JbmZvUmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBkcm1JbmZvOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6c2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IGNvbnRlbnRQYXRoKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNhdmVSaWdodHModW5pcXVlSWQsIGRybVJpZ2h0cywgcmlnaHRzUGF0aCwgY29udGVudFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitTdHJpbmc4IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIFN0cmluZzggbWltZVR5cGUgPSBFTVBUWV9TVFJJTkc7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwYXRoKSB7CisgICAgICAgIG1pbWVUeXBlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0T3JpZ2luYWxNaW1lVHlwZSh1bmlxdWVJZCwgcGF0aCk7CisgICAgfQorICAgIHJldHVybiBtaW1lVHlwZTsKK30KKworaW50IERybU1hbmFnZXJDbGllbnRJbXBsOjpnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgeworICAgIGludCBkcm1PamVjdFR5cGUgPSBEcm1PYmplY3RUeXBlOjpVTktOT1dOOworICAgIGlmICgoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHx8IChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpKSB7CisgICAgICAgICBkcm1PamVjdFR5cGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5nZXREcm1PYmplY3RUeXBlKHVuaXF1ZUlkLCBwYXRoLCBtaW1lVHlwZSk7CisgICAgfQorICAgIHJldHVybiBkcm1PamVjdFR5cGU7Cit9CisKK2ludCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2hlY2tSaWdodHNTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pIHsKKyAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfSU5WQUxJRDsKKyAgICBpZiAoRU1QVFlfU1RSSU5HICE9IHBhdGgpIHsKKyAgICAgICAgcmlnaHRzU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbik7CisgICAgfQorICAgIHJldHVybiByaWdodHNTdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIERybU1hbmFnZXJDbGllbnRJbXBsOjp2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgYm9vbCByZXRDb2RlID0gZmFsc2U7CisgICAgaWYgKEVNUFRZX1NUUklORyAhPSBwYXRoKSB7CisgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT52YWxpZGF0ZUFjdGlvbih1bmlxdWVJZCwgcGF0aCwgYWN0aW9uLCBkZXNjcmlwdGlvbik7CisgICAgfQorICAgIHJldHVybiByZXRDb2RlOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gcGF0aCkgeworICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVSaWdodHModW5pcXVlSWQsIHBhdGgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6cmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5yZW1vdmVBbGxSaWdodHModW5pcXVlSWQpOworfQorCitpbnQgRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgaW50IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOworICAgIGlmIChFTVBUWV9TVFJJTkcgIT0gbWltZVR5cGUpIHsKKyAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPm9wZW5Db252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgbWltZVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBkcm1Db252ZXJ0ZWRTdGF0dXMgPSBOVUxMOworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSkgeworICAgICAgICAgZHJtQ29udmVydGVkU3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29udmVydERhdGEodW5pcXVlSWQsIGNvbnZlcnRJZCwgaW5wdXREYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGRybUNvbnZlcnRlZFN0YXR1czsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpIHsKKyAgICByZXR1cm4gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VDb252ZXJ0U2Vzc2lvbih1bmlxdWVJZCwgY29udmVydElkKTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgaWYgKChOVUxMICE9IGRybVN1cHBvcnRJbmZvQXJyYXkpICYmIChOVUxMICE9IGxlbmd0aCkpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIHJldHVybiBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Cit9CisKK0RlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmkpIHsKKyAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIGlmIChOVUxMICE9IHVyaSkgeworICAgICAgICBoYW5kbGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaSk7CisgICAgfQorICAgIHJldHVybiBoYW5kbGU7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbiggdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYgKE5VTEwgIT0gaGVhZGVySW5mbykpIHsKKyAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYgKE5VTEwgIT0gZW5jQnVmZmVyKQorICAgICAgICAmJiAoTlVMTCAhPSBkZWNCdWZmZXIpICYmIChOVUxMICE9ICpkZWNCdWZmZXIpKSB7CisgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmRlY3J5cHQoCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IERybU1hbmFnZXJDbGllbnRJbXBsOjpmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgc3RhdHVzCisgICAgICAgICAgICA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzc2l6ZV90IERybU1hbmFnZXJDbGllbnRJbXBsOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIHNzaXplX3QgcmV0Q29kZSA9IElOVkFMSURfVkFMVUU7CisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmIChOVUxMICE9IGJ1ZmZlcikgJiYgKDAgPCBudW1CeXRlcykpIHsKKyAgICAgICAgcmV0Q29kZSA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPnByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0Q29kZTsKK30KKworc3RhdHVzX3QgRHJtTWFuYWdlckNsaWVudEltcGw6Om5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSB7CisgICAgaWYgKE5VTEwgIT0gbU9uSW5mb0xpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1PbkluZm9MaXN0ZW5lcjsKKyAgICAgICAgbGlzdGVuZXItPm9uSW5mbyhldmVudCk7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1JT1NlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1JT1NlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQxMjRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybUlPU2VydmljZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lPX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fRFJNX0lPX1NFUlZJQ0VfSF9fCisKKyNpbmNsdWRlICJJRHJtSU9TZXJ2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIElPIHNlcnZpY2UuCisgKgorICogVGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aGlsZSBzdGFydGluZyB0aGUgRFJNIElPIHNlcnZpY2UuCisgKgorICovCitjbGFzcyBEcm1JT1NlcnZpY2UgOiBwdWJsaWMgQm5Ecm1JT1NlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisKK3ByaXZhdGU6CisgICAgRHJtSU9TZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+RHJtSU9TZXJ2aWNlKCk7CisKK3B1YmxpYzoKKyAgICB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKTsKKyAgICBTdHJpbmc4IHJlYWRGcm9tRmlsZShjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCk7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU9fU0VSVklDRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXIuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NjJjMgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX01BTkFHRVJfSF9fCisjZGVmaW5lIF9fRFJNX01BTkFHRVJfSF9fCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisjaW5jbHVkZSAiSURybUVuZ2luZS5oIgorI2luY2x1ZGUgIlBsdWdJbk1hbmFnZXIuaCIKKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSURybU1hbmFnZXI7CitjbGFzcyBEcm1SZWdpc3RyYXRpb25JbmZvOworY2xhc3MgRHJtVW5yZWdpc3RyYXRpb25JbmZvOworY2xhc3MgRHJtUmlnaHRzQWNxdWlzaXRpb25JbmZvOworY2xhc3MgRHJtQ29udGVudElkczsKK2NsYXNzIERybUNvbnN0cmFpbnRzOworY2xhc3MgRHJtTWV0YWRhdGE7CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1JbmZvOworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBBY3Rpb25EZXNjcmlwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gTWFuYWdlci4gVGhpcyBjbGFzcyBkZWxlZ2F0ZXMgdGhlCisgKiBmdW5jdGlvbmFsaXR5IHRvIGNvcnJlc3BvbmRpbmcgRFJNIEVuZ2luZS4KKyAqCisgKiBUaGUgRHJtTWFuYWdlclNlcnZpY2UgY2xhc3MgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICoKKyAqLworY2xhc3MgRHJtTWFuYWdlciA6IHB1YmxpYyBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciB7CitwdWJsaWM6CisgICAgRHJtTWFuYWdlcigpOworICAgIHZpcnR1YWwgfkRybU1hbmFnZXIoKTsKKworcHVibGljOgorICAgIGludCBhZGRVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCBhZGRDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBsb2FkUGx1Z0lucygpOworCisgICAgc3RhdHVzX3QgbG9hZFBsdWdJbnMoY29uc3QgU3RyaW5nOCYgcGx1Z0luRGlyUGF0aCk7CisKKyAgICBzdGF0dXNfdCB1bmxvYWRQbHVnSW5zKCk7CisKKyAgICBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBkcm1TZXJ2aWNlTGlzdGVuZXIpOworCisgICAgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgY29uc3QgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgRHJtSW5mb1N0YXR1cyogcHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKTsKKworICAgIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KTsKKworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKTsKKworICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCisgICAgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBnZXRTdXBwb3J0ZWRQbHVnSW5JZChpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIFN0cmluZzggZ2V0U3VwcG9ydGVkUGx1Z0luSWQoY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgU3RyaW5nOCBnZXRTdXBwb3J0ZWRQbHVnSW5JZEZyb21QYXRoKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBWZWN0b3I8aW50PiBtVW5pcXVlSWRWZWN0b3I7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRU1QVFlfU1RSSU5HOworCisgICAgaW50IG1EZWNyeXB0U2Vzc2lvbklkOworICAgIGludCBtQ29udmVydElkOworICAgIE11dGV4IG1Mb2NrOworICAgIE11dGV4IG1EZWNyeXB0TG9jazsKKyAgICBNdXRleCBtQ29udmVydExvY2s7CisgICAgVFBsdWdJbk1hbmFnZXI8SURybUVuZ2luZT4gbVBsdWdJbk1hbmFnZXI7CisgICAgS2V5ZWRWZWN0b3I8IERybVN1cHBvcnRJbmZvLCBTdHJpbmc4ID4gbVN1cHBvcnRJbmZvVG9QbHVnSW5JZE1hcDsKKyAgICBLZXllZFZlY3RvcjwgaW50LCBJRHJtRW5naW5lKj4gbUNvbnZlcnRTZXNzaW9uTWFwOworICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+ID4gbVNlcnZpY2VMaXN0ZW5lcnM7CisgICAgS2V5ZWRWZWN0b3I8IGludCwgSURybUVuZ2luZSo+IG1EZWNyeXB0U2Vzc2lvbk1hcDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9NQU5BR0VSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvRHJtTWFuYWdlckNsaWVudEltcGwuaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fTUFOQUdFUl9DTElFTlRfSU1QTF9IX18KKyNkZWZpbmUgX19EUk1fTUFOQUdFUl9DTElFTlRfSU1QTF9IX18KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKyNpbmNsdWRlICJJRHJtTWFuYWdlclNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1JbmZvRXZlbnQ7CisvKioKKyAqIFRoaXMgaXMgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERybU1hbmFnZXJDbGllbnQgY2xhc3MuCisgKgorICogT25seSB0aGUgSk5JIGxheWVyIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0byBkZWxlZ2F0ZQorICogZnVuY3Rpb25hbGl0eSB0byBOYXRpdmUgbGF0ZXIuCisgKgorICovCitjbGFzcyBEcm1NYW5hZ2VyQ2xpZW50SW1wbCA6IHB1YmxpYyBCbkRybVNlcnZpY2VMaXN0ZW5lciB7Citwcml2YXRlOgorICAgIERybU1hbmFnZXJDbGllbnRJbXBsKCkgeyB9CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgRHJtTWFuYWdlckNsaWVudEltcGwqIGNyZWF0ZShpbnQqIHBVbmlxdWVJZCk7CisKKyAgICBzdGF0aWMgdm9pZCByZW1vdmUoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgfkRybU1hbmFnZXJDbGllbnRJbXBsKCkgeyB9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBjbGllbnQgcmVzcGVjdGl2ZSB0byBnaXZlbiB1bmlxdWUgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKi8KKyAgICB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgY2xpZW50IHJlc3BlY3RpdmUgdG8gZ2l2ZW4gdW5pcXVlIGlkLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICovCisgICAgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZWQgdG8KKyAgICAgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgICAgICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8RHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogR2V0IGNvbnN0cmFpbnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbnMgZGVmaW5lZCBzdWNoIGFzLAorICAgICAqICAgICBBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjCisgICAgICogQHJldHVybiBEcm1Db25zdHJhaW50cworICAgICAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogR2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBEcm1NZXRhZGF0YQorICAgICAqICAgICAgICAga2V5LXZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhIGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAgICAgKi8KKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1pbWV0eXBlIG9yIHBhdGggY2FuIGJlIGhhbmRsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcGFyYW1baW5dIG1pbWV0eXBlIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IG5lZWRzIHRvIGJlIGhhbmRsZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIFRydWUgaWYgRHJtTWFuYWdlciBjYW4gaGFuZGxlIGdpdmVuIHBhdGggb3IgbWltZSB0eXBlLgorICAgICAqLworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgZ2l2ZW4gZHJtIGluZm9ybWF0aW9uIGJhc2VkIG9uIGl0cyB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm8gSW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHJldHVybiBEcm1JbmZvU3RhdHVzCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgcmVnaXN0cmF0aW9uLCB1bnJlZ2lzdHJhdGlvbiBvciByaWdodHMKKyAgICAgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mb1JlcXVlc3QgUmVxdWVzdCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBkcm1JbmZvCisgICAgICogQHJldHVybiBEcm1JbmZvCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgICAgICogYW5kIG1ha2UgYXNzb2NpYXRpb24gd2l0aCBjb250ZW50IHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIHRoZSBwYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gU3RyaW5nOAorICAgICAqICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGUgcHJvdGVjdGVkIG9iamVjdCAoY29udGVudCwgcmlnaHRzLCBldGMuLikKKyAgICAgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHR5cGUgb2YgdGhlIERSTSBjb250ZW50LAorICAgICAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAgICAgKi8KKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgaGFzIHZhbGlkIHJpZ2h0cyBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAgICAgKi8KKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAgICAgKiBJZiB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmlnaHRzIGlzIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgICAgICogYXBwbGljYXRpb24gY2FsbHMgdGhpcyBhcGkgYWdhaW4gd2l0aCB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgc2V0IHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIHJlc2VydmUgVHJ1ZSBpZiB0aGUgcmlnaHRzIHNob3VsZCBiZSByZXNlcnZlZC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgLyoqCisgICAgICogSW5mb3JtcyB0aGUgRFJNIGVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBsYXliYWNrU3RhdHVzIFBsYXliYWNrIGFjdGlvbiAoUGxheWJhY2s6OlNUQVJULCBQbGF5YmFjazo6U1RPUCwgUGxheWJhY2s6OlBBVVNFKQorICAgICAqIEBwYXJhbVtpbl0gcG9zaXRpb24gUG9zaXRpb24gaW4gdGhlIGZpbGUgKGluIG1pbGxpc2Vjb25kcykgd2hlcmUgdGhlIHN0YXJ0IG9jY3Vycy4KKyAgICAgKiAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIGRlc2NyaXB0aW9uIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICAgICAqLworICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgQVBJIGlzIGZvciBGb3J3YXJkIExvY2sgYmFzZWQgRFJNIHNjaGVtZS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIERlc2NyaXB0aW9uL01JTUUgdHlwZSBvZiB0aGUgaW5wdXQgZGF0YSBwYWNrZXQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBoYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKi8KKyAgICBpbnQgb3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAgICAgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEcm0gQWdlbnQgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYWxsIERybVN1cHBvcnRJbmZvIGluc3RhbmNlIHRoYXQgbmF0aXZlIERSTSBmcmFtZXdvcmsgY2FuIGhhbmRsZS4KKyAgICAgKiBUaGlzIGludGVyZmFjZSBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IEpOSSBsYXllcgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW291dF0gbGVuZ3RoIE51bWJlciBvZiBlbGVtZW50cyBpbiBkcm1TdXBwb3J0SW5mb0FycmF5CisgICAgICogQHBhcmFtW291dF0gZHJtU3VwcG9ydEluZm9BcnJheSBBcnJheSBjb250YWlucyBhbGwgRHJtU3VwcG9ydEluZm8KKyAgICAgKiAgICAgICAgICAgICB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZmQgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBTdGFydCBwb3NpdGlvbiBvZiB0aGUgY29udGVudAorICAgICAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybgorICAgICAqICAgICBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKi8KKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHVyaSBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqLworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHBhcmFtW2luXSBoZWFkZXJJbmZvIEluZm9ybWF0aW9uIGZvciBpbml0aWFsaXppbmcgZGVjcnlwdGlvbiBvZiB0aGlzIGRlY3J5cFVuaXQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gZW5jQnVmZmVyIEVuY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW291dF0gZGVjQnVmZmVyIERlY3J5cHRlZCBkYXRhIGJsb2NrCisgICAgICogQHBhcmFtW2luXSBJViBPcHRpb25hbCBidWZmZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgdGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgQVBJCisgICAgICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKKyAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CisKKyAgICAvKioKKyAgICAgKiBGaW5hbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgd2hpY2ggc3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1bb3V0XSBidWZmZXIgUmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICAgICAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KKyAgICAgKi8KKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgZXZlbnQgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXIKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZXZlbnQgVGhlIGV2ZW50IHRvIGJlIG5vdGlmaWVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBub3RpZnkoY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogSW5zdGFsbCBuZXcgRFJNIEVuZ2luZSBQbHVnLWluIGF0IHRoZSBydW50aW1lCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUVuZ2luZSBTaGFyZWQgT2JqZWN0KHNvKSBGaWxlIGluIHdoaWNoIERSTSBFbmdpbmUgZGVmaW5lZAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgaW5zdGFsbERybUVuZ2luZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIGRybUVuZ2luZUZpbGUpOworCitwcml2YXRlOgorICAgIE11dGV4IG1Mb2NrOworICAgIHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiBtT25JbmZvTGlzdGVuZXI7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIE11dGV4IG1NdXRleDsKKyAgICBzdGF0aWMgc3A8SURybU1hbmFnZXJTZXJ2aWNlPiBtRHJtTWFuYWdlclNlcnZpY2U7CisgICAgc3RhdGljIGNvbnN0IHNwPElEcm1NYW5hZ2VyU2VydmljZT4mIGdldERybU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRU1QVFlfU1RSSU5HOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX01BTkFHRVJfQ0xJRU5UX0lNUExfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0NjM1NgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgIklEcm1NYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgIklEcm1TZXJ2aWNlTGlzdGVuZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1NYW5hZ2VyOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIE11dGV4OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gbWFuYWdlciBzZXJ2aWNlLiBUaGlzIGRlbGVnYXRlcworICogdGhlIHJlc3BvbnNpYmlsaXR5IHRvIERybU1hbmFnZXIuCisgKgorICogVGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aGlsZSBzdGFydGluZyB0aGUgRFJNIG1hbmFnZXIgc2VydmljZS4KKyAqCisgKi8KK2NsYXNzIERybU1hbmFnZXJTZXJ2aWNlIDogcHVibGljIEJuRHJtTWFuYWdlclNlcnZpY2UgeworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisKK3ByaXZhdGU6CisgICAgRHJtTWFuYWdlclNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsIH5Ecm1NYW5hZ2VyU2VydmljZSgpOworCitwdWJsaWM6CisgICAgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisKKyAgICB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCk7CisKKyAgICB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IHNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGRybVNlcnZpY2VMaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSk7CisKKyAgICBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKTsKKworICAgIERybU1ldGFkYXRhKiBnZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisgICAgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb3JlcXVlc3QpOworCisgICAgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsaW50IGFjdGlvbik7CisKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICBib29sIHZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpOworCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CisKKyAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKKworICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworCitwcml2YXRlOgorICAgIERybU1hbmFnZXIqIG1Ecm1NYW5hZ2VyOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX01BTkFHRVJfU0VSVklDRV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0lEcm1JT1NlcnZpY2UuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtSU9TZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwZDkwNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtSU9TZXJ2aWNlLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19JRFJNX0lPX1NFUlZJQ0VfSF9fCisjZGVmaW5lIF9fSURSTV9JT19TRVJWSUNFX0hfXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gSU8gc2VydmljZS4KKyAqCisgKi8KK2NsYXNzIElEcm1JT1NlcnZpY2UgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIGVudW0geworICAgICAgICBXUklURV9UT19GSUxFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgUkVBRF9GUk9NX0ZJTEUKKyAgICB9OworCitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShEcm1JT1NlcnZpY2UpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBkYXRhIGludG8gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHBhcmFtW2luXSBkYXRhQnVmZmVyIERhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGFCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqLworICAgIHZpcnR1YWwgU3RyaW5nOCByZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpID0gMDsKK307CisKKy8qKgorICogVGhpcyBpcyB0aGUgQmluZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBEUk0gSU8gc2VydmljZS4KKyAqLworY2xhc3MgQnBEcm1JT1NlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtSU9TZXJ2aWNlPgoreworcHVibGljOgorICAgIEJwRHJtSU9TZXJ2aWNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICAgICAgOiBCcEludGVyZmFjZTxJRHJtSU9TZXJ2aWNlPihpbXBsKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHdyaXRlVG9GaWxlKGNvbnN0IFN0cmluZzgmIGZpbGVQYXRoLCBjb25zdCBTdHJpbmc4JiBkYXRhQnVmZmVyKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCByZWFkRnJvbUZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBJTyBzZXJ2aWNlLgorICovCitjbGFzcyBCbkRybUlPU2VydmljZTogcHVibGljIEJuSW50ZXJmYWNlPElEcm1JT1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9JT19TRVJWSUNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkYWJkMwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMCwwICsxLDI1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19JRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKyNkZWZpbmUgX19JRFJNX01BTkFHRVJfU0VSVklDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlICJJRHJtU2VydmljZUxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtQ29udGVudElkczsKK2NsYXNzIERybUNvbnN0cmFpbnRzOworY2xhc3MgRHJtTWV0YWRhdGE7CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1JbmZvOworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXM7CitjbGFzcyBTdHJpbmc4OworY2xhc3MgQWN0aW9uRGVzY3JpcHRpb247CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gTWFuYWdlciBzZXJ2aWNlLgorICoKKyAqLworY2xhc3MgSURybU1hbmFnZXJTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgQUREX1VOSVFVRUlEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICAgICAgUkVNT1ZFX1VOSVFVRUlELAorICAgICAgICBBRERfQ0xJRU5ULAorICAgICAgICBSRU1PVkVfQ0xJRU5ULAorICAgICAgICBTRVRfRFJNX1NFUlZJQ0VfTElTVEVORVIsCisgICAgICAgIElOU1RBTExfRFJNX0VOR0lORSwKKyAgICAgICAgR0VUX0NPTlNUUkFJTlRTX0ZST01fQ09OVEVOVCwKKyAgICAgICAgR0VUX01FVEFEQVRBX0ZST01fQ09OVEVOVCwKKyAgICAgICAgQ0FOX0hBTkRMRSwKKyAgICAgICAgUFJPQ0VTU19EUk1fSU5GTywKKyAgICAgICAgQUNRVUlSRV9EUk1fSU5GTywKKyAgICAgICAgU0FWRV9SSUdIVFMsCisgICAgICAgIEdFVF9PUklHSU5BTF9NSU1FVFlQRSwKKyAgICAgICAgR0VUX0RSTV9PQkpFQ1RfVFlQRSwKKyAgICAgICAgQ0hFQ0tfUklHSFRTX1NUQVRVUywKKyAgICAgICAgQ09OU1VNRV9SSUdIVFMsCisgICAgICAgIFNFVF9QTEFZQkFDS19TVEFUVVMsCisgICAgICAgIFZBTElEQVRFX0FDVElPTiwKKyAgICAgICAgUkVNT1ZFX1JJR0hUUywKKyAgICAgICAgUkVNT1ZFX0FMTF9SSUdIVFMsCisgICAgICAgIE9QRU5fQ09OVkVSVF9TRVNTSU9OLAorICAgICAgICBDT05WRVJUX0RBVEEsCisgICAgICAgIENMT1NFX0NPTlZFUlRfU0VTU0lPTiwKKyAgICAgICAgR0VUX0FMTF9TVVBQT1JUX0lORk8sCisgICAgICAgIE9QRU5fREVDUllQVF9TRVNTSU9OLAorICAgICAgICBPUEVOX0RFQ1JZUFRfU0VTU0lPTl9GUk9NX1VSSSwKKyAgICAgICAgQ0xPU0VfREVDUllQVF9TRVNTSU9OLAorICAgICAgICBJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCwKKyAgICAgICAgREVDUllQVCwKKyAgICAgICAgRklOQUxJWkVfREVDUllQVF9VTklULAorICAgICAgICBQUkVBRAorICAgIH07CisKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERybU1hbmFnZXJTZXJ2aWNlKTsKKworcHVibGljOgorICAgIHZpcnR1YWwgaW50IGFkZFVuaXF1ZUlkKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZVVuaXF1ZUlkKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERybVNlcnZpY2VMaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3Qgc3A8SURybVNlcnZpY2VMaXN0ZW5lcj4mIGluZm9MaXN0ZW5lcikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSkgPSAwOworCisgICAgdmlydHVhbCBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pID0gMDsKKworICAgIHZpcnR1YWwgRHJtTWV0YWRhdGEqIGdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgPSAwOworCisgICAgdmlydHVhbCBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvcmVxdWVzdCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgPSAwOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCBnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIHZpcnR1YWwgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSA9IDA7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpID0gMDsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLG9mZl90IG9mZnNldCkgPSAwOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBNYW5hZ2VyIHNlcnZpY2UuCisgKi8KK2NsYXNzIEJwRHJtTWFuYWdlclNlcnZpY2U6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBEcm1NYW5hZ2VyU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgICAgIDogQnBJbnRlcmZhY2U8SURybU1hbmFnZXJTZXJ2aWNlPihpbXBsKSB7fQorCisgICAgdmlydHVhbCBpbnQgYWRkVW5pcXVlSWQoaW50IHVuaXF1ZUlkKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVVbmlxdWVJZChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChpbnQgdW5pcXVlSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREcm1TZXJ2aWNlTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IHNwPElEcm1TZXJ2aWNlTGlzdGVuZXI+JiBpbmZvTGlzdGVuZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnN0YWxsRHJtRW5naW5lKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgZHJtRW5naW5lRmlsZSk7CisKKyAgICB2aXJ0dWFsIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGNvbnN0IGludCBhY3Rpb24pOworCisgICAgdmlydHVhbCBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIHZpcnR1YWwgYm9vbCBjYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbyk7CisKKyAgICB2aXJ0dWFsIERybUluZm8qIGFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9yZXF1ZXN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHZpcnR1YWwgaW50IGdldERybU9iamVjdFR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKyAgICB2aXJ0dWFsIGludCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworICAgIHZpcnR1YWwgRHJtQ29udmVydGVkU3RhdHVzKiBjbG9zZUNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmZfdCBvZmZzZXQpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBNYW5hZ2VyIHNlcnZpY2UuCisgKi8KK2NsYXNzIEJuRHJtTWFuYWdlclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJRHJtTWFuYWdlclNlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9NQU5BR0VSX1NFUlZJQ0VfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9JRHJtU2VydmljZUxpc3RlbmVyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybVNlcnZpY2VMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzEwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvSURybVNlcnZpY2VMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSURSTV9TRVJWSUNFX0xJU1RFTkVSX0hfXworI2RlZmluZSBfX0lEUk1fU0VSVklDRV9MSVNURU5FUl9IX18KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1JbmZvRXZlbnQ7CisKKy8qKgorICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGNsYXNzIGZvciBEUk0gc2VydmljZSBsaXN0ZW5lci4KKyAqCisgKi8KK2NsYXNzIElEcm1TZXJ2aWNlTGlzdGVuZXIgOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIGVudW0geworICAgICAgICBOT1RJRlkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIH07CisKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERybVNlcnZpY2VMaXN0ZW5lcik7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeShjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSA9IDA7Cit9OworCisvKioKKyAqIFRoaXMgaXMgdGhlIEJpbmRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRFJNIHNlcnZpY2UgbGlzdGVuZXIuCisgKi8KK2NsYXNzIEJwRHJtU2VydmljZUxpc3RlbmVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURybVNlcnZpY2VMaXN0ZW5lcj4KK3sKK3B1YmxpYzoKKyAgICBCcERybVNlcnZpY2VMaXN0ZW5lcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgICAgIDogQnBJbnRlcmZhY2U8SURybVNlcnZpY2VMaXN0ZW5lcj4oaW1wbCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5KGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOworfTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBCaW5kZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIERSTSBzZXJ2aWNlIGxpc3RlbmVyLgorICovCitjbGFzcyBCbkRybVNlcnZpY2VMaXN0ZW5lcjogcHVibGljIEJuSW50ZXJmYWNlPElEcm1TZXJ2aWNlTGlzdGVuZXI+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fSURSTV9TRVJWSUNFX0xJU1RFTkVSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQxOTVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19QTFVHSU5fTUFOQUdFUl9IX18KKyNkZWZpbmUgX19QTFVHSU5fTUFOQUdFUl9IX18KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBjaGFyKiBjb25zdCBQTFVHSU5fTUFOQUdFUl9DUkVBVEUgPSAiY3JlYXRlIjsKK2NvbnN0IGNoYXIqIGNvbnN0IFBMVUdJTl9NQU5BR0VSX0RFU1RST1kgPSAiZGVzdHJveSI7Citjb25zdCBjaGFyKiBjb25zdCBQTFVHSU5fRVhURU5TSU9OID0gIi5zbyI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgdGVtcGxhdGUgY2xhc3MgZm9yIFBsdWdpbiBtYW5hZ2VyLgorICoKKyAqIFRoZSBEcm1NYW5hZ2VyIHVzZXMgdGhpcyBjbGFzcyB0byBoYW5kbGUgdGhlIHBsdWdpbnMuCisgKgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgorY2xhc3MgVFBsdWdJbk1hbmFnZXIgeworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHZvaWQqICAgICAgSEFORExFOworICAgIHR5cGVkZWYgVHlwZSogICAgICBjcmVhdGVfdCh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgZGVzdHJveV90KFR5cGUqKTsKKyAgICB0eXBlZGVmIGNyZWF0ZV90KiAgRlBDUkVBVEU7CisgICAgdHlwZWRlZiBkZXN0cm95X3QqIEZQREVTVE9SWTsKKworICAgIHR5cGVkZWYgc3RydWN0IF9QbHVnSW5Db250YWluZXIgeworICAgICAgICBTdHJpbmc4ICAgc1BhdGg7CisgICAgICAgIEhBTkRMRSAgICBoSGFuZGxlOworICAgICAgICBGUENSRUFURSAgZnBDcmVhdGU7CisgICAgICAgIEZQREVTVE9SWSBmcERlc3Rvcnk7CisgICAgICAgIFR5cGUqICAgICBwSW5zdGFuY2U7CisKKyAgICAgICAgX1BsdWdJbkNvbnRhaW5lcigpOgorICAgICAgICAgICAgc1BhdGgoIiIpCisgICAgICAgICAgICAsaEhhbmRsZShOVUxMKQorICAgICAgICAgICAgLGZwQ3JlYXRlKE5VTEwpCisgICAgICAgICAgICAsZnBEZXN0b3J5KE5VTEwpCisgICAgICAgICAgICAscEluc3RhbmNlKE5VTEwpCisgICAgICAgICAgICB7fQorICAgIH0gUGx1Z0luQ29udGFpbmVyOworCisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBQbHVnSW5Db250YWluZXIqPiBQbHVnSW5NYXA7CisgICAgUGx1Z0luTWFwIG1fcGx1Z0luTWFwOworCisgICAgdHlwZWRlZiBWZWN0b3I8U3RyaW5nOD4gUGx1Z0luSWRMaXN0OworICAgIFBsdWdJbklkTGlzdCBtX3BsdWdJbklkTGlzdDsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIExvYWQgYWxsIHRoZSBwbHVnLWlucyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSByc1BsdWdJbkRpclBhdGgKKyAgICAgKiAgICAgRGlyZWN0b3J5IHBhdGggd2hpY2ggcGx1Zy1pbnMgKGR5bmFtaWMgbGlicmFyeSkgYXJlIHN0b3JlZAorICAgICAqIEBub3RlIFBsdWctaW5zIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRQbHVnSW5zKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luRGlyUGF0aCkgeworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luRmlsZUxpc3QgPSBnZXRQbHVnSW5QYXRoTGlzdChyc1BsdWdJbkRpclBhdGgpOworCisgICAgICAgIGlmICghcGx1Z0luRmlsZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBsdWdJbkZpbGVMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgbG9hZFBsdWdJbihwbHVnSW5GaWxlTGlzdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxvYWQgYWxsIHRoZSBwbHVnLWlucworICAgICAqCisgICAgICovCisgICAgdm9pZCB1bmxvYWRQbHVnSW5zKCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG1fcGx1Z0luSWRMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICB1bmxvYWRQbHVnSW4obV9wbHVnSW5JZExpc3RbaV0pOworICAgICAgICB9CisgICAgICAgIG1fcGx1Z0luSWRMaXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCB0aGUgSURzIG9mIGF2YWlsYWJsZSBwbHVnLWlucworICAgICAqCisgICAgICogQHJldHVybltpbl0gcGx1Z0luSWRMaXN0CisgICAgICogICAgIFN0cmluZyB0eXBlIFZlY3RvciBpbiB3aGljaCBhbGwgcGx1Zy1pbiBJRHMgYXJlIHN0b3JlZAorICAgICAqLworICAgIFZlY3RvcjxTdHJpbmc4PiBnZXRQbHVnSW5JZExpc3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BsdWdJbklkTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwbHVnLWluIHJlZmVyZW5jZSBvZiBzcGVjaWZpZWQgSUQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNQbHVnSW5JZAorICAgICAqICAgICBQbHVnLWluIElEIHRvIGJlIHVzZWQKKyAgICAgKiBAcmV0dXJuIHBsdWdJbgorICAgICAqICAgICBSZWZlcmVuY2Ugb2Ygc3BlY2lmaWVkIHBsdWctaW4gaW5zdGFuY2UKKyAgICAgKi8KKyAgICBUeXBlJiBnZXRQbHVnSW4oY29uc3QgU3RyaW5nOCYgcnNQbHVnSW5JZCkgeworICAgICAgICBpZiAoIWNvbnRhaW5zKHJzUGx1Z0luSWQpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGVycm9yIGNhc2UgbmV2ZXIgaGFwcGVucworICAgICAgICB9CisgICAgICAgIHJldHVybiAqKG1fcGx1Z0luTWFwLnZhbHVlRm9yKHJzUGx1Z0luSWQpLT5wSW5zdGFuY2UpOworICAgIH0KKworcHVibGljOgorICAgIC8qKgorICAgICAqIExvYWQgYSBwbHVnLWluIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcnNQbHVnSW5QYXRoCisgICAgICogICAgIFBsdWctaW4gKGR5bmFtaWMgbGlicmFyeSkgZmlsZSBwYXRoCisgICAgICogQG5vdGUgUGx1Zy1pbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uCisgICAgICovCisgICAgdm9pZCBsb2FkUGx1Z0luKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luUGF0aCkgeworICAgICAgICBpZiAoY29udGFpbnMocnNQbHVnSW5QYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUGx1Z0luQ29udGFpbmVyKiBwUGx1Z0luQ29udGFpbmVyID0gbmV3IFBsdWdJbkNvbnRhaW5lcigpOworCisgICAgICAgIHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUgPSBkbG9wZW4ocnNQbHVnSW5QYXRoLnN0cmluZygpLCBSVExEX0xBWlkpOworCisgICAgICAgIGlmIChOVUxMID09IHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwUGx1Z0luQ29udGFpbmVyOworICAgICAgICAgICAgcFBsdWdJbkNvbnRhaW5lciA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5zUGF0aCA9IHJzUGx1Z0luUGF0aDsKKyAgICAgICAgcFBsdWdJbkNvbnRhaW5lci0+ZnBDcmVhdGUKKyAgICAgICAgICAgICAgICA9IChGUENSRUFURSlkbHN5bShwUGx1Z0luQ29udGFpbmVyLT5oSGFuZGxlLCBQTFVHSU5fTUFOQUdFUl9DUkVBVEUpOworICAgICAgICBwUGx1Z0luQ29udGFpbmVyLT5mcERlc3RvcnkKKyAgICAgICAgICAgICAgICA9IChGUERFU1RPUlkpZGxzeW0ocFBsdWdJbkNvbnRhaW5lci0+aEhhbmRsZSwgUExVR0lOX01BTkFHRVJfREVTVFJPWSk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcFBsdWdJbkNvbnRhaW5lci0+ZnBDcmVhdGUgJiYgTlVMTCAhPSBwUGx1Z0luQ29udGFpbmVyLT5mcERlc3RvcnkpIHsKKyAgICAgICAgICAgIHBQbHVnSW5Db250YWluZXItPnBJbnN0YW5jZSA9IChUeXBlKilwUGx1Z0luQ29udGFpbmVyLT5mcENyZWF0ZSgpOworICAgICAgICAgICAgbV9wbHVnSW5JZExpc3QuYWRkKHJzUGx1Z0luUGF0aCk7CisgICAgICAgICAgICBtX3BsdWdJbk1hcC5hZGQocnNQbHVnSW5QYXRoLCBwUGx1Z0luQ29udGFpbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRsY2xvc2UocFBsdWdJbkNvbnRhaW5lci0+aEhhbmRsZSk7CisgICAgICAgICAgICBkZWxldGUgcFBsdWdJbkNvbnRhaW5lcjsKKyAgICAgICAgICAgIHBQbHVnSW5Db250YWluZXIgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5sb2FkIGEgcGx1Zy1pbiBzdG9yZWQgaW4gdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJzUGx1Z0luUGF0aAorICAgICAqICAgICBQbHVnLWluIChkeW5hbWljIGxpYnJhcnkpIGZpbGUgcGF0aAorICAgICAqLworICAgIHZvaWQgdW5sb2FkUGx1Z0luKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luUGF0aCkgeworICAgICAgICBpZiAoIWNvbnRhaW5zKHJzUGx1Z0luUGF0aCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsdWdJbkNvbnRhaW5lciogcFBsdWdJbkNvbnRhaW5lciA9IG1fcGx1Z0luTWFwLnZhbHVlRm9yKHJzUGx1Z0luUGF0aCk7CisgICAgICAgIHBQbHVnSW5Db250YWluZXItPmZwRGVzdG9yeShwUGx1Z0luQ29udGFpbmVyLT5wSW5zdGFuY2UpOworICAgICAgICBkbGNsb3NlKHBQbHVnSW5Db250YWluZXItPmhIYW5kbGUpOworCisgICAgICAgIG1fcGx1Z0luTWFwLnJlbW92ZUl0ZW0ocnNQbHVnSW5QYXRoKTsKKyAgICAgICAgZGVsZXRlIHBQbHVnSW5Db250YWluZXI7CisgICAgICAgIHBQbHVnSW5Db250YWluZXIgPSBOVUxMOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIFRQbHVnSW5NYW5hZ2VyIGNvbnRhaW5zIHJzUGx1Z0luSWQKKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IFN0cmluZzgmIHJzUGx1Z0luSWQpIHsKKyAgICAgICAgcmV0dXJuIG1fcGx1Z0luTWFwLmluZGV4T2ZLZXkocnNQbHVnSW5JZCkgIT0gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGZpbGUgcGF0aCBsaXN0IG9mIHBsdWctaW5zIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQorICAgICAqCisgICAgICogQHBhcmFtW2luXSByc0RpclBhdGgKKyAgICAgKiAgICAgRGlyZWN0b3J5IHBhdGggaW4gd2hpY2ggcGx1Zy1pbnMgYXJlIHN0b3JlZAorICAgICAqIEByZXR1cm4gcGx1Z0luRmlsZUxpc3QKKyAgICAgKiAgICAgU3RyaW5nIHR5cGUgVmVjdG9yIGluIHdoaWNoIGZpbGUgcGF0aCBvZiBwbHVnLWlucyBhcmUgc3RvcmVkCisgICAgICovCisgICAgVmVjdG9yPFN0cmluZzg+IGdldFBsdWdJblBhdGhMaXN0KGNvbnN0IFN0cmluZzgmIHJzRGlyUGF0aCkgeworICAgICAgICBWZWN0b3I8U3RyaW5nOD4gZmlsZUxpc3Q7CisgICAgICAgIERJUiogcERpciA9IG9wZW5kaXIocnNEaXJQYXRoLnN0cmluZygpKTsKKyAgICAgICAgc3RydWN0IGRpcmVudCogcEVudHJ5ID0gbmV3IGRpcmVudCgpOworCisgICAgICAgIHdoaWxlIChOVUxMICE9IHBEaXIgJiYgTlVMTCAhPSAocEVudHJ5ID0gcmVhZGRpcihwRGlyKSkpIHsKKyAgICAgICAgICAgIGlmICghaXNQbHVnSW4ocEVudHJ5KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBwbHVnSW5QYXRoOworICAgICAgICAgICAgcGx1Z0luUGF0aCArPSByc0RpclBhdGg7CisgICAgICAgICAgICBwbHVnSW5QYXRoICs9ICIvIjsKKyAgICAgICAgICAgIHBsdWdJblBhdGggKz0gcEVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgICAgIGZpbGVMaXN0LmFkZChwbHVnSW5QYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChOVUxMICE9IHBEaXIpIHsKKyAgICAgICAgICAgIGNsb3NlZGlyKHBEaXIpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBwRW50cnk7CisgICAgICAgIHBFbnRyeSA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIGZpbGVMaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGlucHV0IG5hbWUgZGVub3RlcyBwbHVnLWluCisgICAgICovCisgICAgYm9vbCBpc1BsdWdJbihjb25zdCBzdHJ1Y3QgZGlyZW50KiBwRW50cnkpIGNvbnN0IHsKKyAgICAgICAgU3RyaW5nOCBzTmFtZShwRW50cnktPmRfbmFtZSk7CisgICAgICAgIGludCBleHRlbnRpb25Qb3MgPSBzTmFtZS5zaXplKCkgLSBTdHJpbmc4KFBMVUdJTl9FWFRFTlNJT04pLnNpemUoKTsKKyAgICAgICAgaWYgKGV4dGVudGlvblBvcyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXh0ZW50aW9uUG9zID09IChpbnQpc05hbWUuZmluZChQTFVHSU5fRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBpbnB1dCBlbnRyeSBpcyAiLiIgb3IgIi4uIgorICAgICAqLworICAgIGJvb2wgaXNEb3RPckREb3QoY29uc3Qgc3RydWN0IGRpcmVudCogcEVudHJ5KSBjb25zdCB7CisgICAgICAgIFN0cmluZzggc05hbWUocEVudHJ5LT5kX25hbWUpOworICAgICAgICByZXR1cm4gIi4iID09IHNOYW1lIHx8ICIuLiIgPT0gc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1ZSBpZiBpbnB1dCBlbnRyeSBpcyBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBib29sIGlzRGlyZWN0b3J5KGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfRElSID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgaW5wdXQgZW50cnkgaXMgcmVndWxhciBmaWxlCisgICAgICovCisgICAgYm9vbCBpc1JlZ3VsYXJGaWxlKGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfUkVHID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgaW5wdXQgZW50cnkgaXMgbGluaworICAgICAqLworICAgIGJvb2wgaXNMaW5rKGNvbnN0IHN0cnVjdCBkaXJlbnQqIHBFbnRyeSkgY29uc3QgeworICAgICAgICByZXR1cm4gRFRfTE5LID09IHBFbnRyeS0+ZF90eXBlOworICAgIH0KK307CisKK307CisKKyNlbmRpZiAvKiBfX1BMVUdJTl9NQU5BR0VSX0hfXyAqLworCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUmVhZFdyaXRlVXRpbHMuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9SZWFkV3JpdGVVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWIzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUmVhZFdyaXRlVXRpbHMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1JFQURfV1JJVEVfVVRJTFNfSF9fCisjZGVmaW5lIF9fUkVBRF9XUklURV9VVElMU19IX18KKworI2luY2x1ZGUgPHV0aWxzL0ZpbGVNYXAuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCBwZXJmb3JtcyBJTyBvcGVyYXRpb25zLgorICoKKyAqLworY2xhc3MgUmVhZFdyaXRlVXRpbHMgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBSZWFkV3JpdGVVdGlscworICAgICAqLworICAgIFJlYWRXcml0ZVV0aWxzKCkge30KKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIFJlYWRXcml0ZVV0aWxzCisgICAgICovCisgICAgdmlydHVhbCB+UmVhZFdyaXRlVXRpbHMoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHJldHVybiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZQorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmc4IHJlYWRCeXRlcyhjb25zdCBTdHJpbmc4JiBmaWxlUGF0aCk7CisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGRhdGEgaW50byB0aGUgZ2l2ZW4gYnVmZmVyIGZyb20gdGhlIGZpbGUgcGF0aCBwcm92aWRlZAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmaWxlUGF0aCBQYXRoIG9mIHRoZSBmaWxlCisgICAgICogQHBhcmFtW291dF0gYnVmZmVyIERhdGEgcmVhZCBmcm9tIHRoZSBmaWxlCisgICAgICogQHJldHVybiBMZW5ndGggb2YgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBmaWxlCisgICAgICovCisgICAgc3RhdGljIGludCByZWFkQnl0ZXMoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNoYXIqKiBidWZmZXIpOworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZGF0YSBpbnRvIHRoZSBmaWxlIHBhdGggcHJvdmlkZWQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVBhdGggUGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbVtpbl0gZGF0YUJ1ZmZlciBEYXRhIHRvIHdyaXRlCisgICAgICovCisgICAgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpOworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRhdGEgaW50byB0aGUgZmlsZSBwYXRoIHByb3ZpZGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZpbGVQYXRoIFBhdGggb2YgdGhlIGZpbGUKKyAgICAgKiBAcGFyYW1baW5dIGRhdGFCdWZmZXIgRGF0YSB0byBhcHBlbmQKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoY29uc3QgU3RyaW5nOCYgZmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIGRhdGEpOworCitwcml2YXRlOgorICAgIEZpbGVNYXAqIG1GaWxlTWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fUkVBRF9XUklURV9VVElMU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1N0cmluZ1Rva2VuaXplci5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1N0cmluZ1Rva2VuaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTc1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvU3RyaW5nVG9rZW5pemVyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19TVFJJTkdfVE9LRU5JWkVSX0hfXworI2RlZmluZSBfX1NUUklOR19UT0tFTklaRVJfSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyBmb3IgU3RyaW5nIG1hbmlwdWxhdGlvbi4KKyAqCisgKi8KK2NsYXNzIFN0cmluZ1Rva2VuaXplciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIHN0cmluZyB0b2tlbnMKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBTdHJpbmdUb2tlbml6ZXI7CisgICAgcHJpdmF0ZToKKyAgICAgICAgSXRlcmF0b3IoU3RyaW5nVG9rZW5pemVyKiBTdHJpbmdUb2tlbml6ZXIpCisgICAgICAgICA6IG1TdHJpbmdUb2tlbml6ZXIoU3RyaW5nVG9rZW5pemVyKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyKiBtU3RyaW5nVG9rZW5pemVyOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nVG9rZW5pemVyCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmluZyBDb21wbGV0ZSBzdHJpbmcgZGF0YQorICAgICAqIEBwYXJhbVtpbl0gZGVsaW1ldGVyIERlbGltZXRlciB1c2VkIHRvIHNwbGl0IHRoZSBzdHJpbmcKKyAgICAgKi8KKyAgICBTdHJpbmdUb2tlbml6ZXIoY29uc3QgU3RyaW5nOCYgc3RyaW5nLCBjb25zdCBTdHJpbmc4JiBkZWxpbWV0ZXIpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgU3RyaW5nVG9rZW5pemVyCisgICAgICovCisgICAgflN0cmluZ1Rva2VuaXplcigpIHt9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogU3BsaXRzIHRoZSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBkZWxpbWV0ZXIKKyAgICAgKi8KKyAgICB2b2lkIHNwbGl0U3RyaW5nKGNvbnN0IFN0cmluZzgmIHN0cmluZywgY29uc3QgU3RyaW5nOCYgZGVsaW1ldGVyKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgc3BsaXQgc3RyaW5nIHZhbHVlcworICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBJdGVyYXRvciBpdGVyYXRvcigpOworCitwcml2YXRlOgorICAgIFZlY3RvcjxTdHJpbmc4PiBtU3RyaW5nVG9rZW5pemVyVmVjdG9yOworfTsKKworfTsKKyNlbmRpZiAvKiBfX1NUUklOR19UT0tFTklaRVJfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjYzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9FTkdJTkVfQkFTRV9IX18KKyNkZWZpbmUgX19EUk1fRU5HSU5FX0JBU0VfSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaD4KKyNpbmNsdWRlICJJRHJtRW5naW5lLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGFuIGludGVyZmFjZSBmb3IgcGx1Zy1pbiBkZXZlbG9wZXJzCisgKgorICogUmVzcG9uc2liaWxpdHkgb2YgdGhpcyBjbGFzcyBpcyBjb250cm9sIHRoZSBzZXF1ZW5jZSBvZiBhY3R1YWwgcGx1Zy1pbi4KKyAqIEFsbCBlYWNoIHBsdWctaW4gZGV2ZWxvcGVyIGhhcyB0byBkbyBpcyBpbXBsZW1lbnQgb25YWFgoKSB0eXBlIHZpcnR1YWwgaW50ZXJmYWNlcy4KKyAqLworY2xhc3MgRHJtRW5naW5lQmFzZSA6IHB1YmxpYyBJRHJtRW5naW5lIHsKK3B1YmxpYzoKKyAgICBEcm1FbmdpbmVCYXNlKCk7CisgICAgdmlydHVhbCB+RHJtRW5naW5lQmFzZSgpOworCitwdWJsaWM6CisgICAgRHJtQ29uc3RyYWludHMqIGdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IHNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCB0ZXJtaW5hdGUoaW50IHVuaXF1ZUlkKTsKKworICAgIGJvb2wgY2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgc3RhdHVzX3Qgc2F2ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgRHJtSW5mbyogYWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisgICAgU3RyaW5nOCBnZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOworCisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQgcG9zaXRpb24pOworCisgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKworICAgIHN0YXR1c190IHJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgc3RhdHVzX3QgcmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBvcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworICAgIERybVN1cHBvcnRJbmZvKiBnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOworCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworCisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CisKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEludGVyZmFjZSBmb3IgcGx1Zy1pbiBkZXZlbG9wZXJzICAgICAgICAgICAgICAgIC8vCisgICAgLy8gZWFjaCBwbHVnLWluIGhhcyB0byBpbXBsZW1lbnQgZm9sbG93aW5nIG1ldGhvZCAgLy8KKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8qKgorICAgICAqIEdldCBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb25zIGRlZmluZWQgc3VjaCBhcywKKyAgICAgKiAgICAgQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YworICAgICAqIEByZXR1cm4gRHJtQ29uc3RyYWludHMKKyAgICAgKiAgICAga2V5LXZhbHVlIHBhaXJzIG9mIGNvbnN0cmFpbnQgYXJlIGVtYmVkZGVkIGluIGl0CisgICAgICogQG5vdGUKKyAgICAgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybUNvbnN0cmFpbnRzKiBvbkdldENvbnN0cmFpbnRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGlucHV0IGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gRHJtTWV0YWRhdGEKKyAgICAgKiAgICAgICAgIGtleS12YWx1ZSBwYWlycyBvZiBtZXRhZGF0YQorICAgICAqIEBub3RlCisgICAgICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgdmlydHVhbCBEcm1NZXRhZGF0YSogb25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgcGx1Zy1pbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZWQgdG8KKyAgICAgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25TZXRPbkluZm9MaXN0ZW5lcigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgPSAwOworCisgICAgLyoqCisgICAgICogVGVybWluYXRlIHRoZSBwbHVnLWluCisgICAgICogYW5kIHJlbGVhc2UgcmVzb3VyY2UgYm91bmQgdG8gcGx1Zy1pbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uVGVybWluYXRlKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRlbnQgY2FuIGJlIGhhbmRsZWQgYnkgdGhpcyBwbHVnaW4gb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCB0aGUgcHJvdGVjdGVkIG9iamVjdAorICAgICAqIEByZXR1cm4gYm9vbAorICAgICAqICAgICBSZXR1cm5zIHRydWUgaWYgdGhpcyBwbHVnaW4gY2FuIGhhbmRsZSAsIGZhbHNlIGluIGNhc2Ugb2Ygbm90IGFibGUgdG8gaGFuZGxlCisgICAgICovCisgICAgdmlydHVhbCBib29sIG9uQ2FuSGFuZGxlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgZ2l2ZW4gZHJtIGluZm9ybWF0aW9uIGJhc2VkIG9uIGl0cyB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm8gSW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHJldHVybiBEcm1JbmZvU3RhdHVzCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybUluZm9TdGF0dXMqIG9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIERSTSByaWdodHMgdG8gc3BlY2lmaWVkIHJpZ2h0cyBwYXRoCisgICAgICogYW5kIG1ha2UgYXNzb2NpYXRpb24gd2l0aCBjb250ZW50IHBhdGgKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gcmlnaHRzUGF0aCBGaWxlIHBhdGggd2hlcmUgcmlnaHRzIHRvIGJlIHNhdmVkCisgICAgICogQHBhcmFtW2luXSBjb250ZW50UGF0aCBGaWxlIHBhdGggd2hlcmUgY29udGVudCB3YXMgc2F2ZWQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNwYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgcmVnaXN0cmF0aW9uLCB1bnJlZ2lzdHJhdGlvbiBvciByaWdodHMKKyAgICAgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mb1JlcXVlc3QgUmVxdWVzdCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBkcm1JbmZvCisgICAgICogQHJldHVybiBEcm1JbmZvCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybUluZm8qIG9uQWNxdWlyZURybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb3JlcXVlc3QpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgbWltZSB0eXBlIGVtYmVkZGVkIGluc2lkZSB0aGUgb3JpZ2luYWwgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBTdHJpbmc4CisgICAgICogICAgIFJldHVybnMgbWltZS10eXBlIG9mIHRoZSBvcmlnaW5hbCBjb250ZW50LCBzdWNoIGFzICJ2aWRlby9tcGVnIgorICAgICAqLworICAgIHZpcnR1YWwgU3RyaW5nOCBvbkdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgICAgICogdXNpbmcgc3BlY2lmaWVkIHBhdGggb3IgbWltZXR5cGUuIEF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgc2hvdWxkIGJlIG5vbiBudWxsCisgICAgICogdG8gcmV0cmlldmUgRFJNIG9iamVjdCB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBvciBudWxsLgorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTWltZSB0eXBlIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHJldHVybiB0eXBlIG9mIHRoZSBEUk0gY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBEcm1PYmplY3RUeXBlOjpDT05URU5ULCBEcm1PYmplY3RUeXBlOjpSSUdIVFNfT0JKRUNUCisgICAgICovCisgICAgdmlydHVhbCBpbnQgb25HZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgZm9yIHRoZSBwcm90ZWN0ZWQgY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICAgICAqLworICAgIHZpcnR1YWwgaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lcyB0aGUgcmlnaHRzIGZvciBhIGNvbnRlbnQuCisgICAgICogSWYgdGhlIHJlc2VydmUgcGFyYW1ldGVyIGlzIHRydWUgdGhlIHJpZ2h0cyBpcyByZXNlcnZlZCB1bnRpbCB0aGUgc2FtZQorICAgICAqIGFwcGxpY2F0aW9uIGNhbGxzIHRoaXMgYXBpIGFnYWluIHdpdGggdGhlIHJlc2VydmUgcGFyYW1ldGVyIHNldCB0byBmYWxzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybS4gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHBhcmFtW2luXSByZXNlcnZlIFRydWUgaWYgdGhlIHJpZ2h0cyBzaG91bGQgYmUgcmVzZXJ2ZWQuCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwbGF5YmFja1N0YXR1cyBQbGF5YmFjayBhY3Rpb24gKFBsYXliYWNrOjpTVEFSVCwgUGxheWJhY2s6OlNUT1AsIFBsYXliYWNrOjpQQVVTRSkKKyAgICAgKiBAcGFyYW1baW5dIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgICAgICogICAgIE9ubHkgdmFsaWQgdG9nZXRoZXIgd2l0aCBQbGF5YmFjazo6U1RBUlQuCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIGRlc2NyaXB0aW9uIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcmlnaHRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvblJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFRoaXMgQVBJIGlzIGZvciBGb3J3YXJkIExvY2sgYmFzZWQgRFJNIHNjaGVtZS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHRzIGFuZCBjb252ZXJ0cyB0aGUgaW5wdXQgZGF0YSB3aGljaCBpcyBwYXJ0IG9mIERSTSBmaWxlLgorICAgICAqIFRoZSByZXN1bHRhbnQgY29udmVydGVkIGRhdGEgYW5kIHRoZSBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gdGhlIERybUNvbnZlcnRlZEluZm8KKyAgICAgKiBvYmplY3QuIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGVyZSBhcmUgbmV3IGJsb2NrCisgICAgICogb2YgZGF0YSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGlucHV0RGF0YSBJbnB1dCBEYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgdGhlIG91dHB1dCBjb252ZXJ0ZWQgZGF0YSBhbmQgb2Zmc2V0LiBJbiB0aGlzIGNhc2UgdGhlCisgICAgICogICAgIGFwcGxpY2F0aW9uIHdpbGwgaWdub3JlIHRoZSBvZmZzZXQgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ29udmVydERhdGEoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEcm0gQWdlbnQgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsCisgICAgICogdGhlIGFnZW50IHdpbGwgaW5mb3JtIHRoYXQgd2hlcmUgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUKKyAgICAgKiBzaG91bGQgYmUgYWRkZWQuIFRoaXMgc2lnbmF0dXJlIGFwcGVuZGluZyBpcyBuZWVkZWQgdG8gaW50ZWdyaXR5CisgICAgICogcHJvdGVjdCB0aGUgY29udmVydGVkIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBkYXRhLiBJdCBhbHNvIGluZm9ybXMKKyAgICAgKiAgICAgdGhlIGFwcGxpY2F0aW9uIG9uIHdoaWNoIG9mZnNldCB0aGVzZSBzaWduYXR1cmUgZGF0YQorICAgICAqICAgICBzaG91bGQgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgdmlydHVhbCBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEcm0gRW5naW5lIGNhcGFiaWxpdGllcyB3aGljaCBpbmNsdWRlcworICAgICAqIHN1cHBvcnRlZCBNaW1lVHlwZXMgYW5kIGZpbGUgc3VmZml4ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIERybVN1cHBvcnRJbmZvCisgICAgICogICAgIGluc3RhbmNlIHdoaWNoIGhvbGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBwbHVnLWluCisgICAgICovCisgICAgdmlydHVhbCBEcm1TdXBwb3J0SW5mbyogb25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBmZCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEBwYXJhbVtpbl0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpID0gMDsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSB1cmkgUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRJZCBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRVbml0SWQgSUQgU3BlY2lmaWVzIGRlY3J5cHRpb24gdW5pdCwgc3VjaCBhcyB0cmFjayBJRAorICAgICAqIEBwYXJhbVtpbl0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKKworICAgIC8qKgorICAgICAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgICAgICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdElkIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHBhcmFtW2luXSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAgICAgKiBAcGFyYW1bb3V0XSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAgICAgKiBAcGFyYW1baW5dIElWIE9wdGlvbmFsIGJ1ZmZlcgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAgICAgKiAgICAgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBhbmQgb25lIG9mIERSTV9FUlJPUl9VTktOT1dOLCBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVECisgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOworCisgICAgLyoqCisgICAgICogRmluYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIFNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtvdXRdIGJ1ZmZlciBSZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSByZWFkIGRhdGEuCisgICAgICogQHBhcmFtW2luXSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW1baW5dIG9mZnNldCBPZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgorICAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSA9IDA7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fRU5HSU5FX0JBU0VfSF9fICovCisKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MzkwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0lEUk1fRU5HSU5FX0hfXworI2RlZmluZSBfX0lEUk1fRU5HSU5FX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRHJtQ29udGVudElkczsKK2NsYXNzIERybUNvbnN0cmFpbnRzOworY2xhc3MgRHJtTWV0YWRhdGE7CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1JbmZvOworY2xhc3MgRHJtSW5mb1N0YXR1czsKK2NsYXNzIERybUNvbnZlcnRlZFN0YXR1czsKK2NsYXNzIERybUluZm9SZXF1ZXN0OworY2xhc3MgRHJtU3VwcG9ydEluZm87CitjbGFzcyBEcm1JbmZvRXZlbnQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhbiBpbnRlcmZhY2UgZm9yIHBsdWctaW4gdXNlcgorICoKKyAqIFJlc3BvbnNpYmlsaXR5IG9mIHRoaXMgY2xhc3MgaXMgcHJvdmlkZSBnZW5lcmljIGludGVyZmFjZSB0byBEUk0gRW5naW5lIE1hbmFnZXIuCisgKiBFYWNoIGludGVyZmFjZSBuZWVkIHRvIGJlIGFzIGFic3RyYWN0IGFzIHBvc3NpYmxlLgorICovCitjbGFzcyBJRHJtRW5naW5lIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JRHJtRW5naW5lKCkgeworICAgIH0KKworcHVibGljOgorICAgIGNsYXNzIE9uSW5mb0xpc3RlbmVyIHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmIGV2ZW50KSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+T25JbmZvTGlzdGVuZXIoKSB7IH0KKyAgICB9OworCitwdWJsaWM6CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgSURybUVuZ2luZSAvLworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgcGx1Zy1pbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvCisgICAgICogcmVjZWl2ZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5mb0xpc3RlbmVyIExpc3RlbmVyCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE9uSW5mb0xpc3RlbmVyKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciogaW5mb0xpc3RlbmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hdGUgdGhlIHBsdWctaW4KKyAgICAgKiBhbmQgcmVsZWFzZSByZXNvdXJjZSBib3VuZCB0byBwbHVnLWluCisgICAgICogZS5nLikgcmVsZWFzZSBuYXRpdmUgcmVzb3VyY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB0ZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9ucyBkZWZpbmVkIHN1Y2ggYXMsCisgICAgICogICAgIEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMKKyAgICAgKiBAcmV0dXJuIERybUNvbnN0cmFpbnRzCisgICAgICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICAgICAqIEBub3RlCisgICAgICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgdmlydHVhbCBEcm1Db25zdHJhaW50cyogZ2V0Q29uc3RyYWludHMoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBEcm1NZXRhZGF0YQorICAgICAqICAgICAgICAga2V5LXZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhCisgICAgICogQG5vdGUKKyAgICAgKiAgICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybiBOVUxMCisgICAgICovCisgICAgdmlydHVhbCBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIHBsdWdpbiBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIHRoZSBwcm90ZWN0ZWQgb2JqZWN0CisgICAgICogQHJldHVybiBib29sCisgICAgICogICAgIHRydWUgaWYgdGhpcyBwbHVnaW4gY2FuIGhhbmRsZSAsIGZhbHNlIGluIGNhc2Ugb2Ygbm90IGFibGUgdG8gaGFuZGxlCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGdpdmVuIGRybSBpbmZvcm1hdGlvbiBiYXNlZCBvbiBpdHMgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkcm1JbmZvIEluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEByZXR1cm4gRHJtSW5mb1N0YXR1cworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgdmlydHVhbCBEcm1JbmZvU3RhdHVzKiBwcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdHJhdGlvbiwgdW5yZWdpc3RyYXRpb24gb3IgcmlnaHRzCisgICAgICogYWNxdWlzaXRpb24gaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICAgICAqIEByZXR1cm4gRHJtSW5mbworICAgICAqICAgICBpbnN0YW5jZSBhcyBhIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGdpdmVuIGlucHV0CisgICAgICovCisgICAgdmlydHVhbCBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgPSAwOworCisgICAgLyoqCisgICAgICogU2F2ZSBEUk0gcmlnaHRzIHRvIHNwZWNpZmllZCByaWdodHMgcGF0aAorICAgICAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gY29udGVudFBhdGggRmlsZSBwYXRoIHdoZXJlIGNvbnRlbnQgd2FzIHNhdmVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIG1pbWUgdHlwZSBlbWJlZGRlZCBpbnNpZGUgdGhlIG9yaWdpbmFsIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4gU3RyaW5nOAorICAgICAqICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGUgcHJvdGVjdGVkIG9iamVjdCAoY29udGVudCwgcmlnaHRzLCBldGMuLikKKyAgICAgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHR5cGUgb2YgdGhlIERSTSBjb250ZW50LAorICAgICAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCBnZXREcm1PYmplY3RUeXBlKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOworCisgICAgLyoqCisgICAgICogQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY29udGVudCBoYXMgdmFsaWQgcmlnaHRzIG9yIG5vdAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0gKEFjdGlvbjo6REVGQVVMVCwgQWN0aW9uOjpQTEFZLCBldGMpCisgICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSByaWdodHMgZm9yIHRoZSBwcm90ZWN0ZWQgY29udGVudCwKKyAgICAgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICAgICAqLworICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICAgICAqIElmIHRoZSByZXNlcnZlIHBhcmFtZXRlciBpcyB0cnVlIHRoZSByaWdodHMgaXMgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYWxscyB0aGlzIGFwaSBhZ2FpbiB3aXRoIHRoZSByZXNlcnZlIHBhcmFtZXRlciBzZXQgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHBlcmZvcm0uIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEBwYXJhbVtpbl0gcmVzZXJ2ZSBUcnVlIGlmIHRoZSByaWdodHMgc2hvdWxkIGJlIHJlc2VydmVkLgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwbGF5YmFja1N0YXR1cyBQbGF5YmFjayBhY3Rpb24gKFBsYXliYWNrOjpTVEFSVCwgUGxheWJhY2s6OlNUT1AsIFBsYXliYWNrOjpQQVVTRSkKKyAgICAgKiBAcGFyYW1baW5dIHBvc2l0aW9uIFBvc2l0aW9uIGluIHRoZSBmaWxlIChpbiBtaWxsaXNlY29uZHMpIHdoZXJlIHRoZSBzdGFydCBvY2N1cnMuCisgICAgICogICAgIE9ubHkgdmFsaWQgdG9nZXRoZXIgd2l0aCBQbGF5YmFjazo6U1RBUlQuCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIGRlc2NyaXB0aW9uIERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBhY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cyhpbnQgdW5pcXVlSWQpID0gMDsKKworICAgIC8qKgorICAgICAqIFRoaXMgQVBJIGlzIGZvciBGb3J3YXJkIExvY2sgYmFzZWQgRFJNIHNjaGVtZS4KKyAgICAgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgICAgICogd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkLCB0aGVuIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8KKyAgICAgKiBiZWdpbiB3aXRoIGNhbGxpbmcgdGhpcyBBUEkuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgPSAwOworCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAgICAgKiBUaGUgcmVzdWx0YW50IGNvbnZlcnRlZCBkYXRhIGFuZCB0aGUgc3RhdHVzIGlzIHJldHVybmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRJbmZvCisgICAgICogb2JqZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlcmUgYXJlIG5ldyBibG9jaworICAgICAqIG9mIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICAgICAqICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgRHJtQ29udmVydGVkU3RhdHVzKiBjb252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpID0gMDsKKworICAgIC8qKgorICAgICAqIEluZm9ybXMgdGhlIERybSBBZ2VudCB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICAgICAqIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBVcG9uIHN1Y2Nlc3NmdWwgY29udmVyc2lvbiBvZiB0aGUgY29tcGxldGUgZGF0YSwKKyAgICAgKiB0aGUgYWdlbnQgd2lsbCBpbmZvcm0gdGhhdCB3aGVyZSB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZQorICAgICAqIHNob3VsZCBiZSBhZGRlZC4gVGhpcyBzaWduYXR1cmUgYXBwZW5kaW5nIGlzIG5lZWRlZCB0byBpbnRlZ3JpdHkKKyAgICAgKiBwcm90ZWN0IHRoZSBjb252ZXJ0ZWQgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICAgICAqIEByZXR1cm4gUmV0dXJuIG9iamVjdCBjb250YWlucyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbnZlcnNpb24sCisgICAgICogICAgIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlIGRhdGEuIEl0IGFsc28gaW5mb3JtcworICAgICAqICAgICB0aGUgYXBwbGljYXRpb24gb24gd2hpY2ggb2Zmc2V0IHRoZXNlIHNpZ25hdHVyZSBkYXRhCisgICAgICogICAgIHNob3VsZCBiZSBhcHBlbmRlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbiggaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRHJtIEVuZ2luZSBjYXBhYmlsaXRpZXMgd2hpY2ggaW5jbHVkZXMKKyAgICAgKiBzdXBwb3J0ZWQgTWltZVR5cGVzIGFuZCBmaWxlIHN1ZmZpeGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHJldHVybiBEcm1TdXBwb3J0SW5mbworICAgICAqICAgICBpbnN0YW5jZSB3aGljaCBob2xkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGEgcGx1Zy1pbgorICAgICAqLworICAgIHZpcnR1YWwgRHJtU3VwcG9ydEluZm8qIGdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgPSAwOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgY3VycmVudCBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGZkIEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPSAwOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgY3VycmVudCBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIHVyaSBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpID0gMDsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBkZWNyeXB0IHNlc3Npb24gZm9yIHRoZSBnaXZlbiBoYW5kbGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcGFyYW1baW5dIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOworCisgICAgLyoqCisgICAgICogRGVjcnlwdCB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgYnVmZmVycyBmb3IgdGhlIGdpdmVuIHVuaXQKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLCBiYXNlZCBvbiBudW1iZXIgb2YKKyAgICAgKiBlbmNyeXB0ZWQgc3RyZWFtcyByZWNlaXZlZCBmcm9tIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHBhcmFtW2luXSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAgICAgKiBAcGFyYW1bb3V0XSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAgICAgKiBAcGFyYW1baW5dIElWIE9wdGlvbmFsIGJ1ZmZlcgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyB0aGUgZXJyb3IgY29kZSBmb3IgdGhpcyBBUEkKKyAgICAgKiAgICAgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBhbmQgb25lIG9mIERSTV9FUlJPUl9VTktOT1dOLCBEUk1fRVJST1JfTElDRU5TRV9FWFBJUkVECisgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW291dF0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAgICAgKiBAcGFyYW1baW5dIG51bUJ5dGVzIE51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqIEBwYXJhbVtpbl0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KSA9IDA7Cit9OworCit9OworCisjZW5kaWYgLyogX19JRFJNX0VOR0lORV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRkYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvTWltZVR5cGVVdGlsLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGliZHJtdXRpbGl0eQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmRsIFwKKyAgICBsaWJkdm0gXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJsb2cKKworCitiYXNlIDo9IGZyYW1ld29ya3MvYmFzZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKEpOSV9IX0lOQ0xVREUpIFwKKyAgICAkKGJhc2UpL2luY2x1ZGUgXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0gXAorICAgICQoYmFzZSkvaW5jbHVkZS9kcm0vcGx1Z2lucyBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKKworaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKExPQ0FMX1BBVEgpL3Rvb2xzCisKK2VuZGlmCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvTWltZVR5cGVVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxMmE2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9pbmNsdWRlL01pbWVUeXBlVXRpbC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTUlNRVRZUEVVVElMX0hfXworI2RlZmluZSBfX01JTUVUWVBFVVRJTF9IX18KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNaW1lVHlwZVV0aWwgeworCitwdWJsaWM6CisKKyAgICBNaW1lVHlwZVV0aWwoKSB7fQorCisgICAgdmlydHVhbCB+TWltZVR5cGVVdGlsKCkge30KKworLyoqCisgKiBNYXkgY29udmVydCB0aGUgbWltZXR5cGUgaWYgdGhlcmUgaXMgYSB3ZWxsIGtub3duCisgKiByZXBsYWNlbWVudCBtaW1ldHlwZSBvdGhlcndpc2UgdGhlIG9yaWdpbmFsIG1pbWV0eXBlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWltZVR5cGUgLSBtaW1ldHlwZSBpbiBsb3dlciBjYXNlIHRvIGNvbnZlcnQuCisgKgorICogQHJldHVybiBtaW1ldHlwZSBvciBudWxsLgorICovCitzdGF0aWMgU3RyaW5nOCBjb252ZXJ0TWltZVR5cGUoU3RyaW5nOCYgbWltZVR5cGUpOworCit9OworfTsKKworI2VuZGlmIC8qIF9fTUlNRVRZUEVVVElMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUvU2Vzc2lvbk1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZmY1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvaW5jbHVkZS9TZXNzaW9uTWFwLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fU0VTU0lPTk1BUF9IX18KKyNkZWZpbmUgX19TRVNTSU9OTUFQX0hfXworCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEEgd3JhcHBlciB0ZW1wbGF0ZSBjbGFzcyBmb3IgaGFuZGxpbmcgRFJNIEVuZ2luZSBzZXNzaW9ucy4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIE5PREU+CitjbGFzcyBTZXNzaW9uTWFwIHsKKworcHVibGljOgorICAgIEtleWVkVmVjdG9yPGludCwgTk9ERT4gbWFwOworCisgICAgU2Vzc2lvbk1hcCgpIHt9CisKKyAgICB2aXJ0dWFsIH5TZXNzaW9uTWFwKCkgeworICAgICAgICBkZXN0cm95TWFwKCk7CisgICAgfQorCisvKioKKyAqIEFkZHMgYSBuZXcgdmFsdWUgaW4gdGhlIHNlc3Npb24gbWFwIHRhYmxlLiBJdCBleHBlY3RzIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYWxyZWFkeQorICogZm9yIHRoZSBzZXNzaW9uIG9iamVjdAorICoKKyAqIEBwYXJhbSBrZXkgLSBrZXkgb3IgU2Vzc2lvbiBJRAorICogQHBhcmFtIHZhbHVlIC0gc2Vzc2lvbiBvYmplY3QgdG8gYWRkCisgKgorICogQHJldHVybiBib29sZWFuIHJlc3VsdCBvZiBhZGRpbmcgdmFsdWUuIHJldHVybnMgZmFsc2UgaWYga2V5IGlzIGFscmVhZHkgZXhpc3QuCisgKi8KK2Jvb2wgYWRkVmFsdWUoaW50IGtleSwgTk9ERSB2YWx1ZSkgeworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBpZiAoIWlzQ3JlYXRlZChrZXkpKSB7CisgICAgICAgIG1hcC5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIHJldHVybnMgdGhlIHNlc3Npb24gb2JqZWN0IGJ5IHRoZSBrZXkKKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9yIFNlc3Npb24gSUQKKyAqCisgKiBAcmV0dXJuIHNlc3Npb24gb2JqZWN0IGFzIHBlciB0aGUga2V5CisgKi8KK05PREUgZ2V0VmFsdWUoaW50IGtleSkgeworICAgIE5PREUgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKGlzQ3JlYXRlZChrZXkpKSB7CisgICAgICAgIHZhbHVlID0gKE5PREUpIG1hcC52YWx1ZUZvcihrZXkpOworICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2Vzc2lvbiBtYXAgdGFibGUKKyAqCisgKiBAcmV0dXJuIGNvdW50IG9mIG51bWJlciBvZiBzZXNzaW9uIG9iamVjdHMuCisgKi8KK2ludCBnZXRTaXplKCkgeworICAgIHJldHVybiBtYXAuc2l6ZSgpOworfQorCisvKioKKyAqIHJldHVybnMgdGhlIHNlc3Npb24gb2JqZWN0IGJ5IHRoZSBpbmRleCBpbiB0aGUgc2Vzc2lvbiBtYXAgdGFibGUKKyAqCisgKiBAcGFyYW0gaW5kZXggLSBpbmRleCBvZiB0aGUgdmFsdWUgcmVxdWlyZWQKKyAqCisgKiBAcmV0dXJuIHNlc3Npb24gb2JqZWN0IGFzIHBlciB0aGUgaW5kZXgKKyAqLworTk9ERSBnZXRWYWx1ZUF0KHVuc2lnbmVkIGludCBpbmRleCkgeworICAgIE5PREUgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKG1hcC5zaXplKCkgPiBpbmRleCkgeworICAgICAgdmFsdWUgPSBtYXAudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIGRlbGV0ZXMgdGhlIG9iamVjdCBmcm9tIHNlc3Npb24gbWFwLiBJdCBhbHNvIGZyZWVzIHVwIG1lbW9yeSBmb3IgdGhlIHNlc3Npb24gb2JqZWN0LgorICoKKyAqIEBwYXJhbSBrZXkgLSBrZXkgb2YgdGhlIHZhbHVlIHRvIGJlIGRlbGV0ZWQKKyAqCisgKi8KK3ZvaWQgcmVtb3ZlVmFsdWUoaW50IGtleSkgeworICAgIGRlbGV0ZVZhbHVlKGdldFZhbHVlKGtleSkpOworICAgIG1hcC5yZW1vdmVJdGVtKGtleSk7Cit9CisKKy8qKgorICogZGVjaWRlcyBpZiBzZXNzaW9uIGlzIGFscmVhZHkgY3JlYXRlZC4KKyAqCisgKiBAcGFyYW0ga2V5IC0ga2V5IG9mIHRoZSB2YWx1ZSBmb3IgdGhlIHNlc3Npb24KKyAqCisgKiBAcmV0dXJuIGJvb2xlYW4gcmVzdWx0IG9mIHdoZXRoZXIgc2Vzc2lvbiBpcyBjcmVhdGVkCisgKi8KK2Jvb2wgaXNDcmVhdGVkKGludCBrZXkpIHsKKyAgICByZXR1cm4gKDAgPD0gbWFwLmluZGV4T2ZLZXkoa2V5KSk7Cit9CisKKy8qKgorICogZW1wdHkgdGhlIGVudGlyZSBzZXNzaW9uIHRhYmxlLiBJdCByZWxlYXNlcyBhbGwgdGhlIG1lbW9yeSBmb3Igc2Vzc2lvbiBvYmplY3RzLgorICovCit2b2lkIGRlc3Ryb3lNYXAoKSB7CisgICAgaW50IHNpemUgPSBtYXAuc2l6ZSgpOworICAgIGludCBpID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZGVsZXRlVmFsdWUobWFwLnZhbHVlQXQoaSkpOworICAgIH0KKworICAgIG1hcC5jbGVhcigpOworfQorCisvKioKKyAqIGZyZWUgdXAgdGhlIG1lbW9yeSBmb3IgdGhlIHNlc3Npb24gb2JqZWN0LgorICogTWFrZSBzdXJlIGlmIGFueSByZWZlcmVuY2UgdG8gdGhlIHNlc3Npb24gb2JqZWN0IGFueXdoZXJlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhCisgKiBkYW5nbGUgcG9pbnRlciBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQHBhcmFtIHZhbHVlIC0gc2Vzc2lvbiBvYmplY3QgdG8gZnJlZQorICoKKyAqLwordm9pZCBkZWxldGVWYWx1ZShOT0RFIHZhbHVlKSB7CisgICAgZGVsZXRlIHZhbHVlOworfQorCit9OworCit9OworCisjZW5kaWYgLyogX19TRVNTSU9OTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL3NyYy9NaW1lVHlwZVV0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTkwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvc3JjL01pbWVUeXBlVXRpbC5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8TWltZVR5cGVVdGlsLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiTWltZVR5cGVVdGlsIgorCitlbnVtIHsKKyAgICBNSU1FVFlQRV9BVURJTyAgICAgICA9IDAsCisgICAgTUlNRVRZUEVfQVBQTElDQVRJT04gPSAxLAorICAgIE1JTUVUWVBFX0lNQUdFICAgICAgID0gMiwKKyAgICBNSU1FVFlQRV9WSURFTyAgICAgICA9IDMsCisgICAgTUlNRVRZUEVfTEFTVCAgICAgICAgPSAtMSwKK307CisKK3N0cnVjdCBNaW1lR3JvdXB7CisgICAgaW50ICAgICAgICAgdHlwZTsgICAgIC8vIEF1ZGlvLCB2aWRlbywuLiB1c2UgdGhlIGVudW0gdmFsdWVzCisgICAgY29uc3QgY2hhciogcEdyb3VwOyAgIC8vICJhdWRpby8iLCAidmlkZW8vIiwuLiBzaG91bGQgY29udGFpbiB0aGUgbGFzdCAiLyIKKyAgICBpbnQgICAgICAgICBzaXplOyAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzLiBlLmcuICJhdWRpby8iID0gNiBieXRlcworfTsKKworc3RydWN0IE1pbWVUeXBlTGlzdHsKKyAgICBpbnQgICAgICAgICB0eXBlOworICAgIGNvbnN0IGNoYXIqIHBNaW1lRXh0OyAgLy8gRXZlcnl0aGluZyBhZnRlciB0aGUgJy8nIGUuZy4gYXVkaW8veC1tcGVnIC0+ICJ4LW1wZWciCisgICAgaW50ICAgICAgICAgc2l6ZTsgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMuIGUuZy4gIngtbXBlZyIgPSA2IGJ5dGVzCisgICAgY29uc3QgY2hhciogcE1pbWVUeXBlOyAvLyBNaW1ldHlwZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZAorfTsKKworCisvLyBLbm93biBtaW1ldHlwZXMgYnkgYW5kcm9pZAorc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX21wZWdbXSAgPSAiYXVkaW8vbXBlZyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fM2dwcFtdICA9ICJhdWRpby8zZ3BwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfdHlwZV9hdWRpb19hbXJbXSAgID0gImF1ZGlvL2Ftci13YiI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX3R5cGVfYXVkaW9fYWFjW10gICA9ICJhdWRpby9tcDRhLWxhdG0iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX2F1ZGlvX3dhdltdICAgPSAiYXVkaW8vd2F2IjsKKworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX3ZpZGVvX21wZWc0W10gPSAidmlkZW8vbXBlZzQiOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV90eXBlX3ZpZGVvXzNncHBbXSAgPSAidmlkZW8vM2dwcCI7CisKKy8vIEtub3duIG1pbWV0eXBlIGdyb3Vwcworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF9hdWRpb1tdICAgICAgID0gImF1ZGlvLyI7CitzdGF0aWMgY29uc3QgY2hhciBtaW1lX2dyb3VwX2FwcGxpY2F0aW9uW10gPSAiYXBwbGljYXRpb24vIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbWVfZ3JvdXBfaW1hZ2VbXSAgICAgICA9ICJpbWFnZS8iOworc3RhdGljIGNvbnN0IGNoYXIgbWltZV9ncm91cF92aWRlb1tdICAgICAgID0gInZpZGVvLyI7CisKK3N0YXRpYyBzdHJ1Y3QgTWltZUdyb3VwIG1pbWVHcm91cFtdID0geworICAgIHtNSU1FVFlQRV9BVURJTywgICAgICAgbWltZV9ncm91cF9hdWRpbywgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX2F1ZGlvKS0xfSwKKyAgICB7TUlNRVRZUEVfQVBQTElDQVRJT04sIG1pbWVfZ3JvdXBfYXBwbGljYXRpb24sICBzaXplb2YobWltZV9ncm91cF9hcHBsaWNhdGlvbiktMX0sCisgICAge01JTUVUWVBFX0lNQUdFLCAgICAgICBtaW1lX2dyb3VwX2ltYWdlLCAgICAgICAgc2l6ZW9mKG1pbWVfZ3JvdXBfaW1hZ2UpLTF9LAorICAgIHtNSU1FVFlQRV9WSURFTywgICAgICAgbWltZV9ncm91cF92aWRlbywgICAgICAgIHNpemVvZihtaW1lX2dyb3VwX3ZpZGVvKS0xfSwKKyAgICB7TUlNRVRZUEVfTEFTVCwgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAwfSAvLyBNdXN0IGJlIGxhc3QgZW50cnkKK307CisKKy8vIExpc3Qgb2YgYWxsIG1pbWV0eXBlcyB0aGF0IHNob3VsZCBiZSBjb252ZXJ0ZWQuCitzdGF0aWMgc3RydWN0IE1pbWVUeXBlTGlzdCBtaW1lVHlwZUxpc3RbXSA9IHsKKyAgICAvLyBNcDMgbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgIm1wMyIsICAgICAgICAgIHNpemVvZigibXAzIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAieC1tcGVnIiwgICAgICAgc2l6ZW9mKCJ4LW1wZWciKS0xLCAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wMyIsICAgICAgICBzaXplb2YoIngtbXAzIiktMSwgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIm1wZyIsICAgICAgICAgIHNpemVvZigibXBnIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisgICAge01JTUVUWVBFX0FVRElPLCAibXBnMyIsICAgICAgICAgc2l6ZW9mKCJtcGciKS0xLCAgICAgICAgIG1pbWVfdHlwZV9hdWRpb19tcGVnfSwKKyAgICB7TUlNRVRZUEVfQVVESU8sICJ4LW1wZyIsICAgICAgICBzaXplb2YoIngtbXBnIiktMSwgICAgICAgbWltZV90eXBlX2F1ZGlvX21wZWd9LAorICAgIHtNSU1FVFlQRV9BVURJTywgIngtbXBlZ2F1ZGlvIiwgIHNpemVvZigieC1tcGVnYXVkaW8iKS0xLCBtaW1lX3R5cGVfYXVkaW9fbXBlZ30sCisKKyAgICAvLyAzZ3BwIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICIzZ3AiLCAgICAgICAgICBzaXplb2YoIjNncCIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvXzNncHB9LAorCisgICAgLy8gQW1yIGF1ZGlvIG1pbWUgdHlwZXMKKyAgICB7TUlNRVRZUEVfQVVESU8sICJhbXIiLCAgICAgICAgICBzaXplb2YoImFtciIpLTEsICAgICAgICAgbWltZV90eXBlX2F1ZGlvX2Ftcn0sCisKKyAgICAvLyBBYWMgYXVkaW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9BVURJTywgImFhYyIsICAgICAgICAgIHNpemVvZigiYWFjIiktMSwgICAgICAgICBtaW1lX3R5cGVfYXVkaW9fYWFjfSwKKworICAgIC8vIFdhdiBhdWRpbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX0FVRElPLCAieC13YXYiLCAgICAgICAgc2l6ZW9mKCJ4LXdhdiIpLTEsICAgICAgIG1pbWVfdHlwZV9hdWRpb193YXZ9LAorCisgICAgLy8gTXBlZzQgdmlkZW8gbWltZSB0eXBlcworICAgIHtNSU1FVFlQRV9WSURFTywgIm1wZzQiLCAgICAgICAgIHNpemVvZigibXBnNCIpLTEsICAgICAgICBtaW1lX3R5cGVfdmlkZW9fbXBlZzR9LAorICAgIHtNSU1FVFlQRV9WSURFTywgIm1wNHYtZXMiLCAgICAgIHNpemVvZigibXA0di1lcyIpLTEsICAgICBtaW1lX3R5cGVfdmlkZW9fbXBlZzR9LAorCisgICAgLy8gM2dwcCB2aWRlbyBtaW1lIHR5cGVzCisgICAge01JTUVUWVBFX1ZJREVPLCAiM2dwIiwgICAgICAgICAgc2l6ZW9mKCIzZ3AiKS0xLCAgICAgICAgIG1pbWVfdHlwZV92aWRlb18zZ3BwfSwKKworICAgIC8vIE11c3QgYmUgbGFzdCBlbnRyeQorICAgIHtNSU1FVFlQRV9MQVNULCAgTlVMTCwgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICBOVUxMfQorfTsKKworLyoqCisgKiBNYXkgY29udmVydCB0aGUgbWltZXR5cGUgaWYgdGhlcmUgaXMgYSB3ZWxsIGtub3duCisgKiByZXBsYWNlbWVudCBtaW1ldHlwZSBvdGhlcndpc2UgdGhlIG9yaWdpbmFsIG1pbWV0eXBlCisgKiBpcyByZXR1cm5lZC4KKyAqCisgKiBAcGFyYW0gbWltZVR5cGUgLSBtaW1ldHlwZSBpbiBsb3dlciBjYXNlIHRvIGNvbnZlcnQuCisgKgorICogQHJldHVybiBtaW1ldHlwZSBvciBudWxsLgorICovCitTdHJpbmc4IE1pbWVUeXBlVXRpbDo6Y29udmVydE1pbWVUeXBlKFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCByZXN1bHQgPSBtaW1lVHlwZTsKKyAgICBjb25zdCBjaGFyKiBwVG1wOworICAgIGNvbnN0IGNoYXIqIHBNaW1lVHlwZTsKKyAgICBzdHJ1Y3QgTWltZUdyb3VwKiBwR3JvdXA7CisgICAgc3RydWN0IE1pbWVUeXBlTGlzdCogcE1pbWVJdGVtOworICAgIGludCBsZW47CisKKyAgICBwTWltZVR5cGUgPSBtaW1lVHlwZS5zdHJpbmcoKTsKKyAgICBpZiAoTlVMTCAhPSBwTWltZVR5cGUpIHsKKyAgICAgICAgLyogQ2hlY2sgd2hpY2ggZ3JvdXAgdGhlIG1pbWV0eXBlIGlzICovCisgICAgICAgIHBHcm91cCA9IG1pbWVHcm91cDsKKworICAgICAgICB3aGlsZSAoTUlNRVRZUEVfTEFTVCAhPSBwR3JvdXAtPnR5cGUpIHsKKyAgICAgICAgICAgIGlmICgwID09IHN0cm5jbXAocE1pbWVUeXBlLCBwR3JvdXAtPnBHcm91cCwgcEdyb3VwLT5zaXplKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEdyb3VwKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBHbyB0aHJvdWdoIHRoZSBtaW1ldHlwZSBsaXN0LiBPbmx5IGNoZWNrIGl0ZW1zIG9mIHRoZSBjb3JyZWN0IGdyb3VwICovCisgICAgICAgIGlmIChNSU1FVFlQRV9MQVNUICE9IHBHcm91cC0+dHlwZSkgeworICAgICAgICAgICAgcE1pbWVJdGVtID0gbWltZVR5cGVMaXN0OworICAgICAgICAgICAgbGVuID0gc3RybGVuIChwTWltZVR5cGUrcEdyb3VwLT5zaXplKTsKKworICAgICAgICAgICAgd2hpbGUgKE1JTUVUWVBFX0xBU1QgIT0gcE1pbWVJdGVtLT50eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKChsZW4gPT0gcE1pbWVJdGVtLT5zaXplKSAmJgorICAgICAgICAgICAgICAgICAgICAoMCA9PSBzdHJjbXAocE1pbWVUeXBlK3BHcm91cC0+c2l6ZSwgcE1pbWVJdGVtLT5wTWltZUV4dCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzgocE1pbWVJdGVtLT5wTWltZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcE1pbWVJdGVtKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HSSgiY29udmVydE1pbWVUeXBlIGdvdCBtaW1ldHlwZSAlcywgY29udmVydGVkIGludG8gbWltZXR5cGUgJXMiLAorICAgICAgICAgICAgIHBNaW1lVHlwZSwgcmVzdWx0LnN0cmluZygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorfTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU3OTYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhNmYxOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitiYXNlIDo9IGZyYW1ld29ya3MvYmFzZQorCisjIERldGVybWluZSB3aGV0aGVyIHRoZSBEUk0gZnJhbWV3b3JrIHVzZXMgNjQtYml0IGRhdGEgdHlwZXMgZm9yIGZpbGUgb2Zmc2V0cyBhbmQgZG8gdGhlIHNhbWUuCitpZm5lcSAoJChzaGVsbCBncmVwIC1jICdvZmY2NF90IG9mZnNldCcgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oKSwgMCkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV82NEJJVF9EUk1fQVBJCitlbmRpZgorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrZW5naW5lCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmljdWkxOG4gXAorICAgIGxpYmljdXVjIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliZGwgXAorICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCisgICAgbGlibmF0aXZlaGVscGVyIFwKKyAgICBsaWJjcnlwdG8gXAorICAgIGxpYnNzbCBcCisgICAgbGliZHJtZnJhbWV3b3JrCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmRybXV0aWxpdHkgXAorICAgIGxpYmRybWZyYW1ld29ya2NvbW1vbiBcCisgICAgbGliZndkbG9jay1jb21tb24gXAorICAgIGxpYmZ3ZGxvY2stY29udmVydGVyIFwKKyAgICBsaWJmd2Rsb2NrLWRlY29kZXIKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChKTklfSF9JTkNMVURFKSBcCisgICAgJChiYXNlKS9pbmNsdWRlL2RybSBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL2luY2x1ZGUgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi91dGlsL2luY2x1ZGUgXAorICAgICQoYmFzZSkvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uIFwKKyAgICAkKGJhc2UpL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlciBcCisgICAgJChiYXNlKS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyIFwKKyAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvZHJtL3BsdWdpbnMvbmF0aXZlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgwNGNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tFTkdJTkVfSF9fCisjZGVmaW5lIF9fRldETE9DS0VOR0lORV9IX18KKworI2luY2x1ZGUgPERybUVuZ2luZUJhc2UuaD4KKyNpbmNsdWRlIDxEcm1Db25zdHJhaW50cy5oPgorI2luY2x1ZGUgPERybVJpZ2h0cy5oPgorI2luY2x1ZGUgPERybUluZm8uaD4KKyNpbmNsdWRlIDxEcm1JbmZvU3RhdHVzLmg+CisjaW5jbHVkZSA8RHJtQ29udmVydGVkU3RhdHVzLmg+CisjaW5jbHVkZSA8RHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxEcm1TdXBwb3J0SW5mby5oPgorI2luY2x1ZGUgPERybUluZm9FdmVudC5oPgorCisjaW5jbHVkZSAiU2Vzc2lvbk1hcC5oIgorI2luY2x1ZGUgIkZ3ZExvY2tDb252LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBGb3J3YXJkIExvY2sgRW5naW5lIGNsYXNzLgorICovCitjbGFzcyBGd2RMb2NrRW5naW5lIDogcHVibGljIGFuZHJvaWQ6OkRybUVuZ2luZUJhc2UgeworCitwdWJsaWM6CisgICAgRndkTG9ja0VuZ2luZSgpOworICAgIHZpcnR1YWwgfkZ3ZExvY2tFbmdpbmUoKTsKKworcHJvdGVjdGVkOgorLyoqCisgKiBHZXQgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9ucyBkZWZpbmVkIHN1Y2ggYXMsCisgKiAgICAgQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YworICogQHJldHVybiBEcm1Db25zdHJhaW50cworICogICAgIGtleS12YWx1ZSBwYWlycyBvZiBjb25zdHJhaW50IGFyZSBlbWJlZGRlZCBpbiBpdAorICogQG5vdGUKKyAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICovCitEcm1Db25zdHJhaW50cyogb25HZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pOworCisvKioKKyAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4gRHJtTWV0YWRhdGEKKyAqICAgICAgRm9yIEZvcndhcmQgTG9jayBlbmdpbmUsIGl0IHJldHVybnMgYW4gZW1wdHkgb2JqZWN0CisgKiBAbm90ZQorICogICAgIEluIGNhc2Ugb2YgZXJyb3IsIHJldHVybnMgTlVMTAorICovCitEcm1NZXRhZGF0YSogb25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisvKioKKyAqIEluaXRpYWxpemUgcGx1Zy1pbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHJlcXVpcmVkIHRvCisgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGluZm9MaXN0ZW5lciBMaXN0ZW5lcgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcik7CisKKy8qKgorICogVGVybWluYXRlIHRoZSBwbHVnLWluIGFuZCByZWxlYXNlIHJlc291cmNlcyBib3VuZCB0byBpdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpOworCisvKioKKyAqIEdldCB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGNhbiBiZSBoYW5kbGVkIGJ5IHRoaXMgcGx1Z2luIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCB0byB0aGUgcHJvdGVjdGVkIG9iamVjdAorICogQHJldHVybiBib29sCisgKiAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBsdWdpbiBjYW4gaGFuZGxlICwgZmFsc2UgaW4gY2FzZSBvZiBub3QgYWJsZSB0byBoYW5kbGUKKyAqLworYm9vbCBvbkNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisvKioKKyAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gRFJNIGluZm9ybWF0aW9uIGFzIGFwcHJvcHJpYXRlIGZvciBpdHMgdHlwZS4KKyAqIE5vdCB1c2VkIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZHJtSW5mbyBJbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHByb2Nlc3NlZAorICogQHJldHVybiBEcm1JbmZvU3RhdHVzCisgKiAgICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAqLworRHJtSW5mb1N0YXR1cyogb25Qcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisvKioKKyAqIFNhdmUgRFJNIHJpZ2h0cyB0byBzcGVjaWZpZWQgcmlnaHRzIHBhdGgKKyAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZHJtUmlnaHRzIERybVJpZ2h0cyB0byBiZSBzYXZlZAorICogQHBhcmFtIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICogQHBhcmFtIGNvbnRlbnRQYXRoIEZpbGUgcGF0aCB3aGVyZSBjb250ZW50IHdhcyBzYXZlZAorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCitzdGF0dXNfdCBvblNhdmVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisvKioKKyAqIFJldHJpZXZlcyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHJlZ2lzdHJhdGlvbiwgdW5yZWdpc3RyYXRpb24gb3IgcmlnaHRzCisgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRybUluZm9SZXF1ZXN0IFJlcXVlc3QgaW5mb3JtYXRpb24gdG8gcmV0cmlldmUgZHJtSW5mbworICogQHJldHVybiBEcm1JbmZvCisgKiAgICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAqLworRHJtSW5mbyogb25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHJldHVybiBTdHJpbmc4CisgKiAgICAgICBSZXR1cm5zIG1pbWUtdHlwZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCwgc3VjaCBhcyAidmlkZW8vbXBlZyIKKyAqLworU3RyaW5nOCBvbkdldE9yaWdpbmFsTWltZVR5cGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworLyoqCisgKiBSZXRyaWV2ZXMgdGhlIHR5cGUgb2YgdGhlIHByb3RlY3RlZCBvYmplY3QgKGNvbnRlbnQsIHJpZ2h0cywgZXRjLi4pCisgKiB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAqIHRvIHJldHJpZXZlIERSTSBvYmplY3QgdHlwZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBvciBudWxsLgorICogQHBhcmFtIG1pbWVUeXBlIE1pbWUgdHlwZSBvZiB0aGUgY29udGVudCBvciBudWxsLgorICogQHJldHVybiB0eXBlIG9mIHRoZSBEUk0gY29udGVudCwKKyAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAqLworaW50IG9uR2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKKworLyoqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90LgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gcGF0aCBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybSAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgKiAgICAgc3VjaCBhcyBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCwgUmlnaHRzU3RhdHVzOjpSSUdIVFNfRVhQSVJFRCwgZXRjLgorICovCitpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbik7CisKKy8qKgorICogQ29uc3VtZXMgdGhlIHJpZ2h0cyBmb3IgYSBjb250ZW50LgorICogSWYgdGhlIHJlc2VydmUgcGFyYW1ldGVyIGlzIHRydWUgdGhlIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQgdW50aWwgdGhlIHNhbWUKKyAqIGFwcGxpY2F0aW9uIGNhbGxzIHRoaXMgYXBpIGFnYWluIHdpdGggdGhlIHJlc2VydmUgcGFyYW1ldGVyIHNldCB0byBmYWxzZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAqIEBwYXJhbSByZXNlcnZlIFRydWUgaWYgdGhlIHJpZ2h0cyBzaG91bGQgYmUgcmVzZXJ2ZWQuCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CisKKy8qKgorICogSW5mb3JtcyB0aGUgRFJNIEVuZ2luZSBhYm91dCB0aGUgcGxheWJhY2sgYWN0aW9ucyBwZXJmb3JtZWQgb24gdGhlIERSTSBmaWxlcy4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gcGxheWJhY2tTdGF0dXMgUGxheWJhY2sgYWN0aW9uIChQbGF5YmFjazo6U1RBUlQsIFBsYXliYWNrOjpTVE9QLCBQbGF5YmFjazo6UEFVU0UpCisgKiBAcGFyYW0gcG9zaXRpb24gUG9zaXRpb24gaW4gdGhlIGZpbGUgKGluIG1pbGxpc2Vjb25kcykgd2hlcmUgdGhlIHN0YXJ0IG9jY3Vycy4KKyAqICAgICBPbmx5IHZhbGlkIHRvZ2V0aGVyIHdpdGggUGxheWJhY2s6OlNUQVJULgorICogQHJldHVybiBzdGF0dXNfdAorICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK3N0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pOworI2Vsc2UKK3N0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CisjZW5kaWYKKworLyoqCisgKiAgVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEBwYXJhbSBhY3Rpb24gQWN0aW9uIHRvIHZhbGlkYXRlIChBY3Rpb246OlBMQVksIEFjdGlvbjo6VFJBTlNGRVIsIGV0YykKKyAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYWN0aW9uCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBpcyBhbGxvd2VkLgorICovCitib29sIG9uVmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisvKioKKyAqIFJlbW92ZXMgdGhlIHJpZ2h0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50LgorICogTm90IHVzZWQgZm9yIEZvcndhcmQgTG9jayBFbmdpbmUuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKy8qKgorICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCisgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0IGJ1dCBkb2VzIG5vdGhpbmcgZm9yCisgKiBGb3J3YXJkIExvY2sgRW5naW5lLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCk7CisKKy8qKgorICogU3RhcnRzIHRoZSBGb3J3YXJkIExvY2sgZmlsZSBjb252ZXJzaW9uIHNlc3Npb24uCisgKiBFYWNoIHRpbWUgdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIGRvd25sb2FkIGEgbmV3IERSTSBmaWxlCisgKiB3aGljaCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyB0bworICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLiBUaGUgY29udmVydElkIGlzIHVzZWQgYXMgdGhlIGNvbnZlcnNpb24gc2Vzc2lvbiBrZXkKKyAqIGFuZCBtdXN0IG5vdCBiZSB0aGUgc2FtZSBmb3IgZGlmZmVyZW50IGNvbnZlcnQgc2Vzc2lvbnMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgKiBAcmV0dXJuIHN0YXR1c190CisgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgKi8KK3N0YXR1c190IG9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKy8qKgorICogQWNjZXB0cyBhbmQgY29udmVydHMgdGhlIGlucHV0IGRhdGEgd2hpY2ggaXMgcGFydCBvZiBEUk0gZmlsZS4KKyAqIFRoZSByZXN1bHRhbnQgY29udmVydGVkIGRhdGEgYW5kIHRoZSBzdGF0dXMgaXMgcmV0dXJuZWQgaW4gdGhlIERybUNvbnZlcnRlZEluZm8KKyAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGlzIGEgbmV3IGJsb2NrCisgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGNvbnZlcnRJZCBIYW5kbGUgZm9yIHRoZSBjb252ZXJ0IHNlc3Npb24KKyAqIEBwYXJhbSBpbnB1dERhdGEgSW5wdXQgRGF0YSB3aGljaCBuZWVkIHRvIGJlIGNvbnZlcnRlZAorICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAqICAgICAgIHRoZSBvdXRwdXQgY29udmVydGVkIGRhdGEgYW5kIG9mZnNldC4gSW4gdGhpcyBjYXNlIHRoZQorICogICAgICBhcHBsaWNhdGlvbiB3aWxsIGlnbm9yZSB0aGUgb2Zmc2V0IGluZm9ybWF0aW9uLgorICovCitEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ29udmVydERhdGEoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb252ZXJ0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpOworCisvKioKKyAqIENsb3NlcyB0aGUgY29udmVydCBzZXNzaW9uIGluIGNhc2Ugb2YgZGF0YSBzdXBwbHkgY29tcGxldGVkIG9yIGVycm9yIG9jY3VycmVkLgorICogVXBvbiBzdWNjZXNzZnVsIGNvbnZlcnNpb24gb2YgdGhlIGNvbXBsZXRlIGRhdGEsIGl0IHJldHVybnMgc2lnbmF0dXJlIGNhbGN1bGF0ZWQgb3ZlcgorICogdGhlIGVudGlyZSBkYXRhIHVzZWQgb3ZlciBhIGNvbnZlcnNpb24gc2Vzc2lvbi4gVGhpcyBzaWduYXR1cmUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIG9mZnNldAorICogbWVudGlvbmVkIGluIHRoZSBEcm1Db252ZXJ0ZWRTdGF0dXMuIFNpZ25hdHVyZSBpcyB1c2VkIGZvciBkYXRhIGludGVncml0eSBwcm90ZWN0aW9uLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAqICAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgKiAgICAgIHRoZSBhcHBsaWNhdGlvbiBhYm91dCB0aGUgZmlsZSBvZmZzZXQgYXQgd2hpY2ggdGhpcworICogICAgICBzaWduYXR1cmUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbi4KKyAqLworRHJtQ29udmVydGVkU3RhdHVzKiBvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRHJtIEVuZ2luZSBjYXBhYmlsaXRpZXMgd2hpY2ggaW5jbHVkZXMKKyAqIHN1cHBvcnRlZCBNaW1lVHlwZXMgYW5kIGZpbGUgc3VmZml4ZXMuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEByZXR1cm4gRHJtU3VwcG9ydEluZm8KKyAqICAgICAgaW5zdGFuY2Ugd2hpY2ggaG9sZHMgdGhlIGNhcGFiaWxpdGllcyBvZiBhIHBsdWctaW4KKyAqLworRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKKworLyoqCisgKiBPcGVuIHRoZSBkZWNyeXB0IHNlc3Npb24gdG8gZGVjcnlwdCB0aGUgZ2l2ZW4gcHJvdGVjdGVkIGNvbnRlbnQuCisgKgorICogQHBhcmFtIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZmQgRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAqIEBwYXJhbSBvZmZzZXQgU3RhcnQgcG9zaXRpb24gb2YgdGhlIGNvbnRlbnQKKyAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAqIEByZXR1cm4KKyAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCisgKi8KKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKyNlbHNlCitzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKyNlbmRpZgorCisvKioKKyAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgY3VycmVudCBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSB1cmkgUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQgdG8gYmUgZGVjcnlwdGVkCisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKTsKKworLyoqCisgKiBDbG9zZSB0aGUgZGVjcnlwdCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gaGFuZGxlLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAqLworc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworLyoqCisgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcGFyYW0gaGVhZGVySW5mbyBJbmZvcm1hdGlvbiBmb3IgaW5pdGlhbGl6aW5nIGRlY3J5cHRpb24gb2YgdGhpcyBkZWNyeXBVbml0CisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisvKioKKyAqIERlY3J5cHQgdGhlIHByb3RlY3RlZCBjb250ZW50IGJ1ZmZlcnMgZm9yIHRoZSBnaXZlbiB1bml0LgorICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW55IG51bWJlciBvZiB0aW1lcywgYmFzZWQgb24gbnVtYmVyIG9mCisgKiBlbmNyeXB0ZWQgc3RyZWFtcyByZWNlaXZlZCBmcm9tIGFwcGxpY2F0aW9uLgorICoKKyAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAqIEBwYXJhbSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICovCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyKTsKKworLyoqCisgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdC4KKyAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICogZW5jcnlwdGVkIHN0cmVhbXMgcmVjZWl2ZWQgZnJvbSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRJZCBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAqIEBwYXJhbSBkZWNyeXB0VW5pdElkIElEIFNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAqIEBwYXJhbSBlbmNCdWZmZXIgRW5jcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBkZWNCdWZmZXIgRGVjcnlwdGVkIGRhdGEgYmxvY2sKKyAqIEBwYXJhbSBJViBPcHRpb25hbCBidWZmZXIKKyAqIEByZXR1cm4gc3RhdHVzX3QKKyAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICogICAgIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgYW5kIG9uZSBvZiBEUk1fRVJST1JfVU5LTk9XTiwgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRAorICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAorICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICovCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOworCisvKioKKyAqIEZpbmFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudC4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gZGVjcnlwdFVuaXRJZCBJRCBTcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgKiBAcmV0dXJuCisgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcworICovCitzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOworCisvKioKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqCisgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCitzc2l6ZV90IG9uUmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgIGludCBudW1CeXRlcyk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoaW4gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gb2Zmc2V0IE9mZnNldCB3aXRoIHdoaWNoIHRvIHVwZGF0ZSB0aGUgZmlsZSBwb3NpdGlvbi4KKyAqIEBwYXJhbSB3aGVuY2UgT25lIG9mIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5ELgorICogICAgICAgICAgIFRoZXNlIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB1bmlzdGQuaC4KKyAqCisgKiBAcmV0dXJuIE5ldyBmaWxlIHBvc2l0aW9uLgorICogQHJldHZhbCAoKG9mZl90KS0xKSBGYWlsdXJlLgorICovCisjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKK29mZjY0X3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKKyNlbHNlCitvZmZfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKKyNlbmRpZgorCisvKioKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAqCisgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgorICogQHBhcmFtIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgKiBAcGFyYW0gYnVmZmVyIFJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIHRoYXQgc2hvdWxkIHJlY2VpdmUgdGhlIHJlYWQgZGF0YS4KKyAqIEBwYXJhbSBudW1CeXRlcyBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICoKKyAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCisgKi8KKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKKyNlbHNlCitzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KTsKKyNlbmRpZgorCitwcml2YXRlOgorCisvKioKKyAqIFNlc3Npb24gQ2xhc3MgZm9yIEZvcndhcmQgTG9jayBDb252ZXJzaW9uLiBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBjcmVhdGVkCisgKiBmb3IgZXZlcnkgY29udmVyc2lvbi4KKyAqLworY2xhc3MgQ29udmVydFNlc3Npb24geworICAgIHB1YmxpYyA6CisgICAgICAgIGludCB1bmlxdWVJZDsKKyAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3Qgb3V0cHV0OworCisgICAgICAgIENvbnZlcnRTZXNzaW9uKCkgeworICAgICAgICAgICAgdW5pcXVlSWQgPSAwOworICAgICAgICAgICAgbWVtc2V0KCZvdXRwdXQsIDAsIHNpemVvZihGd2RMb2NrQ29udl9PdXRwdXRfdCkpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+Q29udmVydFNlc3Npb24oKSB7fQorfTsKKworLyoqCisgKiBTZXNzaW9uIENsYXNzIGZvciBGb3J3YXJkIExvY2sgZGVjb2Rlci4gQW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogZm9yIGV2ZXJ5IGRlY29kaW5nIHNlc3Npb24uCisgKi8KK2NsYXNzIERlY29kZVNlc3Npb24geworICAgIHB1YmxpYyA6CisgICAgICAgIGludCBmaWxlRGVzYzsKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0OworCisgICAgICAgIERlY29kZVNlc3Npb24oKSB7CisgICAgICAgICAgICBmaWxlRGVzYyA9IC0xOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIERlY29kZVNlc3Npb24oaW50IGZkKSB7CisgICAgICAgICAgICBmaWxlRGVzYyA9IGZkOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkRlY29kZVNlc3Npb24oKSB7fQorfTsKKworLyoqCisgKiBTZXNzaW9uIE1hcCBUYWJsZXMgZm9yIENvbnZlcnNpb24gYW5kIERlY29kaW5nIG9mIGZvcndhcmQgbG9jayBmaWxlcy4KKyAqLworU2Vzc2lvbk1hcDxDb252ZXJ0U2Vzc2lvbio+IGNvbnZlcnRTZXNzaW9uTWFwOworU2Vzc2lvbk1hcDxEZWNvZGVTZXNzaW9uKj4gZGVjb2RlU2Vzc2lvbk1hcDsKKworLyoqCisgKiBDb252ZXJ0cyB0aGUgZXJyb3IgY29kZSBmcm9tIEZvcndhcmQgTG9jayBDb252ZXJ0ZXIgdG8gRHJtQ29udmVydFN0YXR1cyBlcnJvciBjb2RlLgorICoKKyAqIEBwYXJhbSBGb3J3YXJkIExvY2sgQ29udmVydGVyIGVycm9yIGNvZGUKKyAqCisgKiBAcmV0dXJuIFN0YXR1cyBjb2RlIGZyb20gRHJtQ29udmVydFN0YXR1cy4KKyAqLworc3RhdGljIGludCBnZXRDb252ZXJ0ZWRTdGF0dXMoRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzKTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0ZXRExPQ0tFTkdJTkVfSF9fICovCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmVDb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTVkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lQ29uc3QuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0ZXRExPQ0tFTkdJTkVDT05TVF9IX18KKyNkZWZpbmUgX19GV0RMT0NLRU5HSU5FQ09OU1RfSF9fCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIGZvcndhcmQgTG9jayBFbmdpbmUgdXNlZCBmb3IgZXhwb3NpbmcgZW5naW5lJ3MgY2FwYWJpbGl0aWVzLgorICovCisjZGVmaW5lIEZXRExPQ0tfRVhURU5TSU9OX0ZMICAgICAgICAgICAoIkZMIikKKyNkZWZpbmUgRldETE9DS19ET1RFWFRFTlNJT05fRkwgICAgICAgICgiLmZsIikKKyNkZWZpbmUgRldETE9DS19NSU1FVFlQRV9GTCAgICAgICAgICAgICgiYXBwbGljYXRpb24veC1hbmRyb2lkLWRybS1mbCIpCisKKyNkZWZpbmUgRldETE9DS19FWFRFTlNJT05fRE0gICAgICAgICAgICgiRE0iKQorI2RlZmluZSBGV0RMT0NLX0RPVEVYVEVOU0lPTl9ETSAgICAgICAgKCIuZG0iKQorI2RlZmluZSBGV0RMT0NLX01JTUVUWVBFX0RNICAgICAgICAgICAgKCJhcHBsaWNhdGlvbi92bmQub21hLmRybS5tZXNzYWdlIikKKworI2RlZmluZSBGV0RMT0NLX0RFU0NSSVBUSU9OICAgICAgICAgICAgKCJPTUEgVjEgRm9yd2FyZCBMb2NrIikKKworfTsKKworI2VuZGlmIC8qIF9fRldETE9DS0VOR0lORUNPTlNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzMGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU2Vzc2lvbk1hcC5oIgorI2luY2x1ZGUgIkZ3ZExvY2tFbmdpbmUuaCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPERybVJpZ2h0cy5oPgorI2luY2x1ZGUgPERybUNvbnN0cmFpbnRzLmg+CisjaW5jbHVkZSA8RHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxEcm1JbmZvLmg+CisjaW5jbHVkZSA8RHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPERybUluZm9SZXF1ZXN0Lmg+CisjaW5jbHVkZSA8RHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAiRndkTG9ja0NvbnYuaCIKKyNpbmNsdWRlICJGd2RMb2NrRmlsZS5oIgorI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisjaW5jbHVkZSAiRndkTG9ja0VuZ2luZUNvbnN0LmgiCisjaW5jbHVkZSAiTWltZVR5cGVVdGlsLmgiCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkZ3ZExvY2tFbmdpbmUiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIElEcm1FbmdpbmUqIGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IEZ3ZExvY2tFbmdpbmUoKTsKK30KKworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveShJRHJtRW5naW5lKiBwbHVnSW4pIHsKKyAgICBkZWxldGUgcGx1Z0luOworfQorCitGd2RMb2NrRW5naW5lOjpGd2RMb2NrRW5naW5lKCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgQ29uc3RydWN0aW9uIik7Cit9CisKK0Z3ZExvY2tFbmdpbmU6On5Gd2RMb2NrRW5naW5lKCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgRGVzdHJ1Y3Rpb24iKTsKKworICAgIGNvbnZlcnRTZXNzaW9uTWFwLmRlc3Ryb3lNYXAoKTsKKyAgICBkZWNvZGVTZXNzaW9uTWFwLmRlc3Ryb3lNYXAoKTsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6OmdldENvbnZlcnRlZFN0YXR1cyhGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBpbnQgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfRVJST1I7CisKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX09LOgorICAgICAgICAgICAgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I6CisgICAgICAgIGNhc2UgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDoKKyAgICAgICAgY2FzZSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0OgorICAgICAgICBjYXNlIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOgorICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZSBnZXRDb252ZXJ0ZWRTdGF0dXM6IGZpbGUgY29udmVyc2lvbiBFcnJvciAlZC4gIiBcCisgICAgICAgICAgICAgICAgICAiUmV0dXJuaW5nIFNUQVRVU19JTlBVVERBVEFfRVJST1IiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0U3RhdHVzID0gRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfSU5QVVREQVRBX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lIGdldENvbnZlcnRlZFN0YXR1czogZmlsZSBjb252ZXJzaW9uIEVycm9yICVkLiAiIFwKKyAgICAgICAgICAgICAgICAgICJSZXR1cm5pbmcgU1RBVFVTX0VSUk9SIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldFN0YXR1czsKK30KKworRHJtQ29uc3RyYWludHMqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoLCBpbnQgYWN0aW9uKSB7CisgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gTlVMTDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMiKTsKKworICAgIGlmIChOVUxMICE9IHBhdGggJiYKKyAgICAgICAgKFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEID09IG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsICpwYXRoLCBhY3Rpb24pKSkgeworICAgICAgICAvLyBSZXR1cm4gdGhlIGVtcHR5IGNvbnN0cmFpbnRzIHRvIHNob3cgbm8gZXJyb3IgY29uZGl0aW9uLgorICAgICAgICBkcm1Db25zdHJhaW50cyA9IG5ldyBEcm1Db25zdHJhaW50cygpOworICAgIH0KKworICAgIHJldHVybiBkcm1Db25zdHJhaW50czsKK30KKworRHJtTWV0YWRhdGEqIEZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4KiBwYXRoKSB7CisgICAgRHJtTWV0YWRhdGEqIGRybU1ldGFkYXRhID0gTlVMTDsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEiKTsKKworICAgIGlmIChOVUxMICE9IHBhdGgpIHsKKyAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBtZXRhZGF0YSB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgZHJtTWV0YWRhdGEgPSBuZXcgRHJtTWV0YWRhdGEoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJtTWV0YWRhdGE7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUiKTsKKworCisgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIC0tIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uIHN1Y2NlZWRlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZSAtLSBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbiBmYWlsZWQ6IgorICAgICAgICAgICAgICJlcnJubyA9ICVkIiwgZXJybm8pOworICAgIH0KKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190CitGd2RMb2NrRW5naW5lOjpvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcikgeworICAgIC8vIE5vdCB1c2VkCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lciIpOworCisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUiKTsKKworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK0RybVN1cHBvcnRJbmZvKiBGd2RMb2NrRW5naW5lOjpvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCkgeworICAgIERybVN1cHBvcnRJbmZvKiBwU3VwcG9ydEluZm8gPSBuZXcgRHJtU3VwcG9ydEluZm8oKTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0U3VwcG9ydEluZm8iKTsKKworICAgIC8vIGZpbGwgYWxsIEZvcndhcmQgTG9jayBtaW1ldHlwZXMgYW5kIGV4dGVuc2lvbnMKKyAgICBpZiAoTlVMTCAhPSBwU3VwcG9ydEluZm8pIHsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRkwpKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRGaWxlU3VmZml4KFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRkwpKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KEZXRExPQ0tfTUlNRVRZUEVfRE0pKTsKKyAgICAgICAgcFN1cHBvcnRJbmZvLT5hZGRGaWxlU3VmZml4KFN0cmluZzgoRldETE9DS19ET1RFWFRFTlNJT05fRE0pKTsKKworICAgICAgICBwU3VwcG9ydEluZm8tPnNldERlc2NyaXB0aW9uKFN0cmluZzgoRldETE9DS19ERVNDUklQVElPTikpOworICAgIH0KKworICAgIHJldHVybiBwU3VwcG9ydEluZm87Cit9CisKK2Jvb2wgRndkTG9ja0VuZ2luZTo6b25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIFN0cmluZzggZXh0U3RyaW5nID0gcGF0aC5nZXRQYXRoRXh0ZW5zaW9uKCk7CisKKyAgICBleHRTdHJpbmcudG9Mb3dlcigpOworCisgICAgaWYgKChleHRTdHJpbmcgPT0gU3RyaW5nOChGV0RMT0NLX0RPVEVYVEVOU0lPTl9GTCkpIHx8CisgICAgICAgIChleHRTdHJpbmcgPT0gU3RyaW5nOChGV0RMT0NLX0RPVEVYVEVOU0lPTl9ETSkpKSB7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0RybUluZm9TdGF0dXMqIEZ3ZExvY2tFbmdpbmU6Om9uUHJvY2Vzc0RybUluZm8oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1JbmZvKiBkcm1JbmZvKSB7CisgICAgRHJtSW5mb1N0YXR1cyAqZHJtSW5mb1N0YXR1cyA9IE5VTEw7CisKKyAgICAvLyBOb3RoaW5nIHRvIHByb2Nlc3MKKworICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cygoaW50KURybUluZm9TdGF0dXM6OlNUQVRVU19PSywgMCwgTlVMTCwgU3RyaW5nOCgiIikpOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Qcm9jZXNzRHJtSW5mbyIpOworCisgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2F2ZVJpZ2h0cygKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgIGNvbnN0IERybVJpZ2h0cyYgZHJtUmlnaHRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNvbnRlbnRQYXRoKSB7CisgICAgLy8gTm8gcmlnaHRzIHRvIHNhdmUuIFJldHVybgorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uU2F2ZVJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworRHJtSW5mbyogRndkTG9ja0VuZ2luZTo6b25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOworCisgICAgLy8gTm90aGluZyB0byBiZSBkb25lIGZvciBGb3J3YXJkIExvY2sgZmlsZQorICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8iKTsKKworICAgIHJldHVybiBkcm1JbmZvOworfQorCitpbnQgRndkTG9ja0VuZ2luZTo6b25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbikgeworICAgIGludCByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DaGVja1JpZ2h0c1N0YXR1cyIpOworCisgICAgLy8gT25seSBUcmFuc2ZlciBhY3Rpb24gaXMgbm90IGFsbG93ZWQgZm9yIGZvcndhcmQgTG9jayBmaWxlcy4KKyAgICBpZiAob25DYW5IYW5kbGUodW5pcXVlSWQsIHBhdGgpKSB7CisgICAgICAgIHN3aXRjaChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpERUZBVUxUOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlBMQVk6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6UklOR1RPTkU6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6T1VUUFVUOgorICAgICAgICAgICAgY2FzZSBBY3Rpb246OlBSRVZJRVc6CisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6RVhFQ1VURToKKyAgICAgICAgICAgIGNhc2UgQWN0aW9uOjpESVNQTEFZOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFjdGlvbjo6VFJBTlNGRVI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJpZ2h0c1N0YXR1czo6UklHSFRTX0lOVkFMSUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpIHsKKyAgICAvLyBObyByaWdodHMgY29uc3VtcHRpb24KKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMiKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitib29sIEZ3ZExvY2tFbmdpbmU6Om9uVmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uIik7CisKKyAgICAvLyBGb3IgdGhlIGZvcndhcmRsb2NrIGVuZ2luZSBjaGVja1JpZ2h0cyBhbmQgVmFsaWRhdGVBY3Rpb24gYXJlIHRoZSBzYW1lLgorICAgIHJldHVybiAob25DaGVja1JpZ2h0c1N0YXR1cyh1bmlxdWVJZCwgcGF0aCwgYWN0aW9uKSA9PSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCk7Cit9CisKK1N0cmluZzggRndkTG9ja0VuZ2luZTo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZSIpOworICAgIFN0cmluZzggbWltZVN0cmluZyA9IFN0cmluZzgoIiIpOworICAgIGludCBmaWxlRGVzYyA9IEZ3ZExvY2tGaWxlX29wZW4ocGF0aC5zdHJpbmcoKSk7CisKKyAgICBpZiAoLTEgPCBmaWxlRGVzYykgeworICAgICAgICBjb25zdCBjaGFyKiBwTWltZVR5cGUgPSBGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShmaWxlRGVzYyk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcE1pbWVUeXBlKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlID0gU3RyaW5nOChwTWltZVR5cGUpOworICAgICAgICAgICAgY29udGVudFR5cGUudG9Mb3dlcigpOworICAgICAgICAgICAgbWltZVN0cmluZyA9IE1pbWVUeXBlVXRpbDo6Y29udmVydE1pbWVUeXBlKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEZ3ZExvY2tGaWxlX2Nsb3NlKGZpbGVEZXNjKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVN0cmluZzsKK30KKworaW50IEZ3ZExvY2tFbmdpbmU6Om9uR2V0RHJtT2JqZWN0VHlwZShpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CisgICAgU3RyaW5nOCBtaW1lU3RyID0gU3RyaW5nOChtaW1lVHlwZSk7CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldERybU9iamVjdFR5cGUiKTsKKworICAgIG1pbWVTdHIudG9Mb3dlcigpOworCisgICAgLyogQ2hlY2tzIHdoZXRoZXIKKyAgICAqIDEuIHBhdGggYW5kIG1pbWUgdHlwZSBib3RoIGFyZSBub3QgZW1wdHkgc3RyaW5ncyAobWVhbmluZyB1bmF2YWlsYWJsZSkgZWxzZSBjb250ZW50IGlzIHVua25vd24KKyAgICAqIDIuIGlmIG9uZSBvZiB0aGVtIGlzIGVtcHR5IHN0cmluZyBhbmQgaWYgb3RoZXIgaXMga25vd24gdGhlbiBpdHMgYSBEUk0gQ29udGVudCBPYmplY3QuCisgICAgKiAzLiBpZiBib3RoIG9mIHRoZW0gYXJlIGF2YWlsYWJsZSwgdGhlbiBib3RoIG1heSBiZSBvZiBrbm93biB0eXBlCisgICAgKiAgICAocmVnYXJkbGVzcyBvZiB0aGUgcmVsYXRpb24gYmV0d2VlbiB0aGVtIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIG90aGVyIERSTSBFbmdpbmVzKQorICAgICovCisgICAgaWYgKCgoMCA9PSBwYXRoLmxlbmd0aCgpKSB8fCBvbkNhbkhhbmRsZSh1bmlxdWVJZCwgcGF0aCkpICYmCisgICAgICAgICgoMCA9PSBtaW1lVHlwZS5sZW5ndGgoKSkgfHwgKChtaW1lU3RyID09IFN0cmluZzgoRldETE9DS19NSU1FVFlQRV9GTCkpIHx8CisgICAgICAgIChtaW1lU3RyID09IFN0cmluZzgoRldETE9DS19NSU1FVFlQRV9ETSkpKSkgJiYgKG1pbWVUeXBlICE9IHBhdGgpICkgeworICAgICAgICAgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OkNPTlRFTlQ7CisgICAgfQorCisgICAgcmV0dXJuIERybU9iamVjdFR5cGU6OlVOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIC8vIE5vIFJpZ2h0cyB0byByZW1vdmUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIC8vIE5vIHJpZ2h0cyB0byByZW1vdmUKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZUFsbFJpZ2h0cyIpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworI2Vsc2UKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworI2VuZGlmCisgICAgLy8gTm90IHVzZWQKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzIik7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24iKTsKKyAgICBpZiAoIWNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CisgICAgICAgIENvbnZlcnRTZXNzaW9uICpuZXdTZXNzaW9uID0gbmV3IENvbnZlcnRTZXNzaW9uKCk7CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9TdGF0dXNfT0sgPT0KKyAgICAgICAgICAgIEZ3ZExvY2tDb252X09wZW5TZXNzaW9uKCYobmV3U2Vzc2lvbi0+dW5pcXVlSWQpLCAmKG5ld1Nlc3Npb24tPm91dHB1dCkpKSB7CisgICAgICAgICAgICBjb252ZXJ0U2Vzc2lvbk1hcC5hZGRWYWx1ZShjb252ZXJ0SWQsIG5ld1Nlc3Npb24pOworICAgICAgICAgICAgcmVzdWx0ID0gRFJNX05PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24gLS0gRndkTG9ja0NvbnZfT3BlblNlc3Npb24gZmFpbGVkLiIpOworICAgICAgICAgICAgZGVsZXRlIG5ld1Nlc3Npb247CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBGd2RMb2NrRW5naW5lOjpvbkNvbnZlcnREYXRhKGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICBEcm1CdWZmZXIgKmNvbnZSZXN1bHQgPSBuZXcgRHJtQnVmZmVyKE5VTEwsIDApOworICAgIGludCBvZmZzZXQgPSAtMTsKKworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSAmJiBjb252ZXJ0U2Vzc2lvbk1hcC5pc0NyZWF0ZWQoY29udmVydElkKSkgeworICAgICAgICBDb252ZXJ0U2Vzc2lvbiAqY29udlNlc3Npb24gPSBjb252ZXJ0U2Vzc2lvbk1hcC5nZXRWYWx1ZShjb252ZXJ0SWQpOworCisgICAgICAgIGlmIChOVUxMICE9IGNvbnZTZXNzaW9uKSB7CisgICAgICAgICAgICByZXRTdGF0dXMgPSBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YShjb252U2Vzc2lvbi0+dW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoY29udlNlc3Npb24tPm91dHB1dCkpOworCisgICAgICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09IHJldFN0YXR1cykgeworICAgICAgICAgICAgICAgIC8vIHJldHVybiBieXRlcyBmcm9tIGNvbnZlcnNpb24gaWYgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgaWYgKGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb252UmVzdWx0LT5kYXRhID0gbmV3IGNoYXJbY29udlNlc3Npb24tPm91dHB1dC5mcm9tQ29udmVydERhdGEubnVtQnl0ZXNdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGNvbnZSZXN1bHQtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvbnZSZXN1bHQtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiljb252U2Vzc2lvbi0+b3V0cHV0LmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKGdldENvbnZlcnRlZFN0YXR1cyhyZXRTdGF0dXMpLCBjb252UmVzdWx0LCBvZmZzZXQpOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIEZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVydElkKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3QgcmV0U3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICBEcm1CdWZmZXIgKmNvbnZSZXN1bHQgPSBuZXcgRHJtQnVmZmVyKE5VTEwsIDApOworICAgIGludCBvZmZzZXQgPSAtMTsKKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbiIpOworCisgICAgaWYgKGNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CisgICAgICAgIENvbnZlcnRTZXNzaW9uICpjb252U2Vzc2lvbiA9IGNvbnZlcnRTZXNzaW9uTWFwLmdldFZhbHVlKGNvbnZlcnRJZCk7CisKKyAgICAgICAgaWYgKE5VTEwgIT0gY29udlNlc3Npb24pIHsKKyAgICAgICAgICAgIHJldFN0YXR1cyA9IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbihjb252U2Vzc2lvbi0+dW5pcXVlSWQsICYoY29udlNlc3Npb24tPm91dHB1dCkpOworCisgICAgICAgICAgICBpZiAoRndkTG9ja0NvbnZfU3RhdHVzX09LID09IHJldFN0YXR1cykgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNvbnZTZXNzaW9uLT5vdXRwdXQuZnJvbUNsb3NlU2Vzc2lvbi5maWxlT2Zmc2V0OworICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmRhdGEgPSBuZXcgY2hhcltGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkVdOworCisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gY29udlJlc3VsdC0+ZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgIGNvbnZSZXN1bHQtPmxlbmd0aCA9IEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29udlJlc3VsdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiljb252U2Vzc2lvbi0+b3V0cHV0LmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJlc3VsdC0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udmVydFNlc3Npb25NYXAucmVtb3ZlVmFsdWUoY29udmVydElkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoZ2V0Q29udmVydGVkU3RhdHVzKHJldFN0YXR1cyksIGNvbnZSZXN1bHQsIG9mZnNldCk7Cit9CisKKyNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQorc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgpIHsKKyNlbHNlCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKKyNlbmRpZgorICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworICAgIGludCBmaWxlRGVzYyA9IC0xOworCisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKKworICAgIGlmICgoLTEgPCBmZCkgJiYKKyAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICAgICAgKCFkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgeworICAgICAgICBmaWxlRGVzYyA9IGR1cChmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24gcGFyYW1ldGVyIGVycm9yIik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKC0xIDwgZmlsZURlc2MgJiYKKyAgICAgICAgLTEgPCA6OmxzZWVrKGZpbGVEZXNjLCBvZmZzZXQsIFNFRUtfU0VUKSAmJgorICAgICAgICAtMSA8IEZ3ZExvY2tGaWxlX2F0dGFjaChmaWxlRGVzYykpIHsKKyAgICAgICAgLy8gY2hlY2sgZm9yIGZpbGUgaW50ZWdyaXR5LiBUaGlzIG11c3QgYmUgZG9uZSB0byBwcm90ZWN0IHRoZSBjb250ZW50IG1hbmdsaW5nLgorICAgICAgICBpbnQgcmV0VmFsID0gRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoZmlsZURlc2MpOworICAgICAgICBEZWNvZGVTZXNzaW9uKiBkZWNvZGVTZXNzaW9uID0gbmV3IERlY29kZVNlc3Npb24oZmlsZURlc2MpOworCisgICAgICAgIGlmIChyZXRWYWwgJiYgTlVMTCAhPSBkZWNvZGVTZXNzaW9uKSB7CisgICAgICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmFkZFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCwgZGVjb2RlU2Vzc2lvbik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwbWltZT0gRndkTG9ja0ZpbGVfR2V0Q29udGVudFR5cGUoZmlsZURlc2MpOworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZSA9IFN0cmluZzgocG1pbWUgPT0gTlVMTCA/ICIiIDogcG1pbWUpOworICAgICAgICAgICAgY29udGVudFR5cGUudG9Mb3dlcigpOworICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUgPSBNaW1lVHlwZVV0aWw6OmNvbnZlcnRNaW1lVHlwZShjb250ZW50VHlwZSk7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9IERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQ7CisgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5zdGF0dXMgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRDsKKyAgICAgICAgICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOworICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKTsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmlsZURlc2MpOworICAgICAgICAgICAgZGVsZXRlIGRlY29kZVNlc3Npb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBFeGl0LiByZXN1bHQgPSAlZCIsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CisgICAgY29uc3QgY2hhciBmaWxlVGFnIFtdID0gImZpbGU6Ly8iOworCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgeworICAgICAgICBTdHJpbmc4IHVyaVRhZyA9IFN0cmluZzgodXJpKTsKKyAgICAgICAgdXJpVGFnLnRvTG93ZXIoKTsKKworICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHVyaVRhZy5zdHJpbmcoKSwgZmlsZVRhZywgc2l6ZW9mKGZpbGVUYWcpIC0gMSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gc3RyY2hyKHVyaSArIHNpemVvZihmaWxlVGFnKSAtIDEsICcvJyk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBmaWxlUGF0aCAmJiBvbkNhbkhhbmRsZSh1bmlxdWVJZCwgU3RyaW5nOChmaWxlUGF0aCkpKSB7CisgICAgICAgICAgICAgICAgaW50IGZkID0gb3BlbihmaWxlUGF0aCwgT19SRE9OTFkpOworCisgICAgICAgICAgICAgICAgaWYgKC0xIDwgZmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGlzIGFsd2F5cyAwIGFuZCBsZW5ndGggaXMgbm90IHVzZWQuIHNvIGFueSBwb3NpdGl2ZSBzaXplLgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZmQsIDAsIDEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGZkIGlzIGR1cGxpY2F0ZWQgYWxyZWFkeSBpZiBzdWNjZXNzLiBjbG9zaW5nIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKKyAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKKworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOworICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKKyAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChzZXNzaW9uLT5maWxlRGVzYyk7CisgICAgICAgICAgICA6OmNsb3NlKHNlc3Npb24tPmZpbGVEZXNjKTsKKyAgICAgICAgICAgIGRlY29kZVNlc3Npb25NYXAucmVtb3ZlVmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IERSTV9OT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiBFeGl0Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKKyAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlcikgeworICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOworICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0Iik7CisgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOworfQorCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUmVhZChpbnQgdW5pcXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKSB7CisgICAgc3NpemVfdCBzaXplID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmCisgICAgICAgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAmJgorICAgICAgICBOVUxMICE9IGJ1ZmZlciAmJgorICAgICAgICBudW1CeXRlcyA+IC0xKSB7CisgICAgICAgIERlY29kZVNlc3Npb24qIHNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CisgICAgICAgIGlmIChOVUxMICE9IHNlc3Npb24gJiYgc2Vzc2lvbi0+ZmlsZURlc2MgPiAtMSkgeworICAgICAgICAgICAgc2l6ZSA9IEZ3ZExvY2tGaWxlX3JlYWQoc2Vzc2lvbi0+ZmlsZURlc2MsIGJ1ZmZlciwgbnVtQnl0ZXMpOworCisgICAgICAgICAgICBpZiAoMCA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5vZmZzZXQgPSAoKG9mZl90KS0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitvZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CisjZWxzZQorb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgeworI2VuZGlmCisgICAgb2ZmX3Qgb2ZmdmFsID0gLTE7CisKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CisgICAgICAgICAgICBvZmZ2YWwgPSBGd2RMb2NrRmlsZV9sc2VlayhzZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgc2Vzc2lvbi0+b2Zmc2V0ID0gb2ZmdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnZhbDsKK30KKworI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKKyNlbHNlCitzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CisjZW5kaWYKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IC0xOworCisgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlclNlc3Npb24gPSBOVUxMOworCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgIChOVUxMICE9IChkZWNvZGVyU2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpICYmCisgICAgICAgIChOVUxMICE9IGJ1ZmZlcikgJiYKKyAgICAgICAgKG51bUJ5dGVzID4gLTEpICYmCisgICAgICAgIChvZmZzZXQgPiAtMSkpIHsKKyAgICAgICAgaWYgKG9mZnNldCAhPSBkZWNvZGVyU2Vzc2lvbi0+b2Zmc2V0KSB7CisgICAgICAgICAgICBkZWNvZGVyU2Vzc2lvbi0+b2Zmc2V0ID0gb25Mc2Vlayh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKChvZmZfdCktMSkgIT0gZGVjb2RlclNlc3Npb24tPm9mZnNldCkgeworICAgICAgICAgICAgYnl0ZXNSZWFkID0gb25SZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25QcmVhZCBlcnJvciByZWFkaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblByZWFkIGRlY3J5cHRJZCBub3QgZm91bmQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzk2MQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVkM2NmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRndkTG9ja0dsdWUuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KKworTE9DQUxfTU9EVUxFIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiZGE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5jCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIEtFWV9TSVpFIDE2CisjZGVmaW5lIEtFWV9TSVpFX0lOX0JJVFMgKEtFWV9TSVpFICogOCkKKworc3RhdGljIGludCBpc0luaXRpYWxpemVkID0gRkFMU0U7CisKK3N0YXRpYyBjb25zdCBjaGFyIHN0cktleUZpbGVuYW1lW10gPSAiL2RhdGEvZHJtL2Z3ZGxvY2sva2VrLmRhdCI7CisKK3N0YXRpYyBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CitzdGF0aWMgQUVTX0tFWSBkZWNyeXB0aW9uUm91bmRLZXlzOworCisvKioKKyAqIENyZWF0ZXMgYWxsIGRpcmVjdG9yaWVzIGFsb25nIHRoZSBmdWxseSBxdWFsaWZpZWQgcGF0aCBvZiB0aGUgZ2l2ZW4gZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIHBhdGggQSByZWZlcmVuY2UgdG8gdGhlIGZ1bGx5IHF1YWxpZmllZCBwYXRoIG9mIGEgZmlsZS4KKyAqIEBwYXJhbVtpbl0gbW9kZSBUaGUgYWNjZXNzIG1vZGUgdG8gdXNlIGZvciB0aGUgZGlyZWN0b3JpZXMgYmVpbmcgY3JlYXRlZC4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrR2x1ZV9DcmVhdGVEaXJlY3Rvcmllcyhjb25zdCBjaGFyICpwYXRoLCBtb2RlX3QgbW9kZSkgeworICAgIGludCByZXN1bHQgPSBUUlVFOworICAgIHNpemVfdCBwYXJ0aWFsUGF0aExlbmd0aCA9IHN0cmxlbihwYXRoKTsKKyAgICBjaGFyICpwYXJ0aWFsUGF0aCA9IG1hbGxvYyhwYXJ0aWFsUGF0aExlbmd0aCArIDEpOworICAgIGlmIChwYXJ0aWFsUGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFydGlhbFBhdGhMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKHBhdGhbaV0gPT0gJy8nICYmIGkgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFydGlhbFBhdGhbaV0gPSAnXDAnOworICAgICAgICAgICAgICAgIGlmIChta2RpcihwYXJ0aWFsUGF0aCwgbW9kZSkgIT0gMCAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcnRpYWxQYXRoW2ldID0gcGF0aFtpXTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKHBhcnRpYWxQYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgcm91bmQga2V5cyB1c2VkIGZvciBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIG9mIHNlc3Npb24ga2V5cy4gRmlyc3QgY3JlYXRlcyBhCisgKiBkZXZpY2UtdW5pcXVlIGtleS1lbmNyeXB0aW9uIGtleSBpZiBub25lIGV4aXN0cyB5ZXQuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVSb3VuZEtleXMoKSB7CisgICAgdW5zaWduZWQgY2hhciBrZXlFbmNyeXB0aW9uS2V5W0tFWV9TSVpFXTsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKHN0cktleUZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZpbGVEZXNjID49IDApIHsKKyAgICAgICAgaWYgKHJlYWQoZmlsZURlc2MsIGtleUVuY3J5cHRpb25LZXksIEtFWV9TSVpFKSA9PSBLRVlfU0laRSkgeworICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpY2xvc2UoZmlsZURlc2MpOworICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UICYmCisgICAgICAgICAgICAgICBGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIoa2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkUpICYmCisgICAgICAgICAgICAgICBGd2RMb2NrR2x1ZV9DcmVhdGVEaXJlY3RvcmllcyhzdHJLZXlGaWxlbmFtZSwgU19JUldYVSkpIHsKKyAgICAgICAgZmlsZURlc2MgPSBvcGVuKHN0cktleUZpbGVuYW1lLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZLCBTX0lSVVNSKTsKKyAgICAgICAgaWYgKGZpbGVEZXNjID49IDApIHsKKyAgICAgICAgICAgIGlmICh3cml0ZShmaWxlRGVzYywga2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkUpID09IEtFWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgaXNJbml0aWFsaXplZCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCljbG9zZShmaWxlRGVzYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkVfSU5fQklUUywgJmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDAgfHwKKyAgICAgICAgICAgIEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5RW5jcnlwdGlvbktleSwgS0VZX1NJWkVfSU5fQklUUywgJmRlY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgIGlzSW5pdGlhbGl6ZWQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZW1zZXQoa2V5RW5jcnlwdGlvbktleSwgMCwgS0VZX1NJWkUpOyAvLyBaZXJvIG91dCBrZXkgZGF0YS4KK30KKworLyoqCisgKiBWYWxpZGF0ZXMgdGhlIHBhZGRpbmcgb2YgYSBkZWNyeXB0ZWQga2V5LgorICoKKyAqIEBwYXJhbVtpbl0gcERhdGEgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkZWNyeXB0ZWQga2V5IGFuZCBwYWRkaW5nLgorICogQHBhcmFtW2luXSBkZWNyeXB0ZWRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGVjcnlwdGVkIGtleS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhZGRpbmcgd2FzIHZhbGlkLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tHbHVlX1ZhbGlkYXRlUGFkZGluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpwRGF0YSwgc2l6ZV90IGRlY3J5cHRlZEtleUxlbmd0aCkgeworICAgIHNpemVfdCBpOworICAgIHNpemVfdCBwYWRkaW5nID0gQUVTX0JMT0NLX1NJWkUgLSAoZGVjcnlwdGVkS2V5TGVuZ3RoICUgQUVTX0JMT0NLX1NJWkUpOworICAgIHBEYXRhICs9IGRlY3J5cHRlZEtleUxlbmd0aDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFkZGluZzsgKytpKSB7CisgICAgICAgIGlmICgoc2l6ZV90KSpwRGF0YSAhPSBwYWRkaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKytwRGF0YTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBGd2RMb2NrR2x1ZV9HZXRSYW5kb21OdW1iZXIodm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKSB7CisgICAgLy8gR2VuZXJhdGUgJ2NyeXB0b2dyYXBoaWNhbGx5IHNlY3VyZScgcmFuZG9tIGJ5dGVzIGJ5IHJlYWRpbmcgdGhlbSBmcm9tICIvZGV2L3VyYW5kb20iICh0aGUKKyAgICAvLyBub24tYmxvY2tpbmcgdmVyc2lvbiBvZiAiL2Rldi9yYW5kb20iKS4KKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgaW50IGZpbGVEZXNjID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwKSB7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IHJlYWQoZmlsZURlc2MsIHBCdWZmZXIsIG51bUJ5dGVzKTsKKyAgICAgICAgKHZvaWQpY2xvc2UoZmlsZURlc2MpOworICAgIH0KKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkID49IDAgJiYgKHNpemVfdCludW1CeXRlc1JlYWQgPT0gbnVtQnl0ZXM7Cit9CisKK2ludCBGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpIHsKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3Qgb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworICAgIHB0aHJlYWRfb25jZSgmb25jZSwgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZVJvdW5kS2V5cyk7CisgICAgcmV0dXJuIGlzSW5pdGlhbGl6ZWQ7Cit9CisKK3NpemVfdCBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCkgeworICAgIHJldHVybiAoKHBsYWludGV4dEtleUxlbmd0aCAvIEFFU19CTE9DS19TSVpFKSArIDIpICogQUVTX0JMT0NLX1NJWkU7Cit9CisKK2ludCBGd2RMb2NrR2x1ZV9FbmNyeXB0S2V5KGNvbnN0IHZvaWQgKnBQbGFpbnRleHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGxhaW50ZXh0S2V5TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgpIHsKKyAgICBpbnQgcmVzdWx0ID0gRkFMU0U7CisgICAgYXNzZXJ0KGVuY3J5cHRlZEtleUxlbmd0aCA9PSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgocGxhaW50ZXh0S2V5TGVuZ3RoKSk7CisgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBpbml0VmVjdG9yW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgaWYgKEZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcihpbml0VmVjdG9yLCBBRVNfQkxPQ0tfU0laRSkpIHsKKyAgICAgICAgICAgIHNpemVfdCBwYWRkaW5nID0gQUVTX0JMT0NLX1NJWkUgLSAocGxhaW50ZXh0S2V5TGVuZ3RoICUgQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAgICAgc2l6ZV90IGRhdGFMZW5ndGggPSBlbmNyeXB0ZWRLZXlMZW5ndGggLSBBRVNfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIG1lbWNweShwRW5jcnlwdGVkS2V5LCBwUGxhaW50ZXh0S2V5LCBwbGFpbnRleHRLZXlMZW5ndGgpOworICAgICAgICAgICAgbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopcEVuY3J5cHRlZEtleSArIHBsYWludGV4dEtleUxlbmd0aCwgKGludClwYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKXBFbmNyeXB0ZWRLZXkgKyBkYXRhTGVuZ3RoLCBpbml0VmVjdG9yLCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBBRVNfY2JjX2VuY3J5cHQocEVuY3J5cHRlZEtleSwgcEVuY3J5cHRlZEtleSwgZGF0YUxlbmd0aCwgJmVuY3J5cHRpb25Sb3VuZEtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFZlY3RvciwgQUVTX0VOQ1JZUFQpOworICAgICAgICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0dsdWVfRGVjcnlwdEtleShjb25zdCB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBEZWNyeXB0ZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVjcnlwdGVkS2V5TGVuZ3RoKSB7CisgICAgaW50IHJlc3VsdCA9IEZBTFNFOworICAgIGFzc2VydChlbmNyeXB0ZWRLZXlMZW5ndGggPT0gRndkTG9ja0dsdWVfR2V0RW5jcnlwdGVkS2V5TGVuZ3RoKGRlY3J5cHRlZEtleUxlbmd0aCkpOworICAgIGlmIChGd2RMb2NrR2x1ZV9Jbml0aWFsaXplS2V5RW5jcnlwdGlvbigpKSB7CisgICAgICAgIHNpemVfdCBkYXRhTGVuZ3RoID0gZW5jcnlwdGVkS2V5TGVuZ3RoIC0gQUVTX0JMT0NLX1NJWkU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBEYXRhID0gbWFsbG9jKGRhdGFMZW5ndGgpOworICAgICAgICBpZiAocERhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbml0VmVjdG9yW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgICAgIG1lbWNweShwRGF0YSwgcEVuY3J5cHRlZEtleSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoaW5pdFZlY3RvciwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwRW5jcnlwdGVkS2V5ICsgZGF0YUxlbmd0aCwgQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAgICAgQUVTX2NiY19lbmNyeXB0KHBEYXRhLCBwRGF0YSwgZGF0YUxlbmd0aCwgJmRlY3J5cHRpb25Sb3VuZEtleXMsIGluaXRWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX0RFQ1JZUFQpOworICAgICAgICAgICAgbWVtY3B5KHBEZWNyeXB0ZWRLZXksIHBEYXRhLCBkZWNyeXB0ZWRLZXlMZW5ndGgpOworICAgICAgICAgICAgcmVzdWx0ID0gRndkTG9ja0dsdWVfVmFsaWRhdGVQYWRkaW5nKHBEYXRhLCBkZWNyeXB0ZWRLZXlMZW5ndGgpOworICAgICAgICAgICAgZnJlZShwRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0Z3ZExvY2tHbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2ZjZlYQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbi9Gd2RMb2NrR2x1ZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0dMVUVfSF9fCisjZGVmaW5lIF9fRldETE9DS0dMVUVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBieXRlcy4KKyAqCisgKiBAcGFyYW1bb3V0XSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmFuZG9tIGRhdGEuCisgKiBAcGFyYW1baW5dIG51bUJ5dGVzIFRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdlbmVyYXRlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGtleS1lbmNyeXB0aW9uIGtleS4gU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGR1cmluZyBzdGFydHVwIHRvCisgKiBmYWNpbGl0YXRlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2Ygc2Vzc2lvbiBrZXlzLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24oKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGVuY3J5cHRlZCBrZXksIGdpdmVuIHRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dCBrZXkuCisgKgorICogQHBhcmFtW2luXSBwbGFpbnRleHRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcGxhaW50ZXh0IGtleS4KKyAqCisgKiBAcmV0dXJuIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBrZXkuCisgKi8KK3NpemVfdCBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoc2l6ZV90IHBsYWludGV4dEtleUxlbmd0aCk7CisKKy8qKgorICogRW5jcnlwdHMgdGhlIGdpdmVuIHNlc3Npb24ga2V5IHVzaW5nIGEga2V5LWVuY3J5cHRpb24ga2V5IHVuaXF1ZSB0byB0aGlzIGRldmljZS4KKyAqCisgKiBAcGFyYW1baW5dIHBQbGFpbnRleHRLZXkgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwbGFpbnRleHQga2V5LgorICogQHBhcmFtW2luXSBwbGFpbnRleHRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcGxhaW50ZXh0IGtleS4KKyAqIEBwYXJhbVtvdXRdIHBFbmNyeXB0ZWRLZXkgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQga2V5LgorICogQHBhcmFtW2luXSBlbmNyeXB0ZWRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGtleS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0VuY3J5cHRLZXkoY29uc3Qgdm9pZCAqcFBsYWludGV4dEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwbGFpbnRleHRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuY3J5cHRlZEtleUxlbmd0aCk7CisKKy8qKgorICogRGVjcnlwdHMgdGhlIGdpdmVuIHNlc3Npb24ga2V5IHVzaW5nIGEga2V5LWVuY3J5cHRpb24ga2V5IHVuaXF1ZSB0byB0aGlzIGRldmljZS4KKyAqCisgKiBAcGFyYW1baW5dIHBFbmNyeXB0ZWRLZXkgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQga2V5LgorICogQHBhcmFtW2luXSBlbmNyeXB0ZWRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jcnlwdGVkIGtleS4KKyAqIEBwYXJhbVtvdXRdIHBEZWNyeXB0ZWRLZXkgQSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkZWNyeXB0ZWQga2V5LgorICogQHBhcmFtW2luXSBkZWNyeXB0ZWRLZXlMZW5ndGggVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGVjcnlwdGVkIGtleS4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworaW50IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkoY29uc3Qgdm9pZCAqcEVuY3J5cHRlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRLZXlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwRGVjcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY3J5cHRlZEtleUxlbmd0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfX0ZXRExPQ0tHTFVFX0hfXwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQubWsgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRndkTG9ja0NvbnYuYworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uIFwKKyAgICBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjcnlwdG8KKworTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYmZ3ZGxvY2stY29tbW9uCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJmd2Rsb2NrLWNvbnZlcnRlcgorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZWE5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuYwpAQCAtMCwwICsxLDEzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisKKyNpbmNsdWRlICJGd2RMb2NrQ29udi5oIgorI2luY2x1ZGUgIkZ3ZExvY2tHbHVlLmgiCisKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworI2RlZmluZSBJTlZBTElEX09GRlNFVCAoKG9mZjY0X3QpLTEpCisKKyNkZWZpbmUgTUFYX05VTV9TRVNTSU9OUyAzMgorCisjZGVmaW5lIE9VVFBVVF9CVUZGRVJfU0laRV9JTkNSRU1FTlQgMTAyNAorI2RlZmluZSBSRUFEX0JVRkZFUl9TSVpFIDEwMjQKKworI2RlZmluZSBNQVhfQk9VTkRBUllfTEVOR1RIIDcwCisjZGVmaW5lIE1BWF9ERUxJTUlURVJfTEVOR1RIIChNQVhfQk9VTkRBUllfTEVOR1RIICsgNCkKKworI2RlZmluZSBTVFJJTkdfTEVOR1RIX0lOQ1JFTUVOVCAyNQorCisjZGVmaW5lIEtFWV9TSVpFIEFFU19CTE9DS19TSVpFCisjZGVmaW5lIEtFWV9TSVpFX0lOX0JJVFMgKEtFWV9TSVpFICogOCkKKworI2RlZmluZSBTSEExX0hBU0hfU0laRSAyMAorCisjZGVmaW5lIEZXRF9MT0NLX1ZFUlNJT04gMAorI2RlZmluZSBGV0RfTE9DS19TVUJGT1JNQVQgMAorI2RlZmluZSBVU0FHRV9SRVNUUklDVElPTl9GTEFHUyAwCisjZGVmaW5lIENPTlRFTlRfVFlQRV9MRU5HVEhfUE9TIDcKKyNkZWZpbmUgVE9QX0hFQURFUl9TSVpFIDgKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwYXJzZXIgc3RhdGVzIG9mIHRoZSBjb252ZXJ0ZXIuCisgKi8KK3R5cGVkZWYgZW51bSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZSB7CisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNPcGVuRGVsaW1pdGVyLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzTWltZUhlYWRlcnMsCisgICAgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCaW5hcnlFbmNvZGVkRGF0YSwKKyAgICBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0Jhc2U2NEVuY29kZWREYXRhLAorICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX0RvbmUKK30gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBzY2FubmVyIHN0YXRlcyBvZiB0aGUgY29udmVydGVyLgorICovCit0eXBlZGVmIGVudW0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlIHsKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2gsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRiwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUeXBlU3RhcnQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGUsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdTdGFydCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQV9PUl9JLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19OLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19SLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ZLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19TLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19FLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c182LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c180LAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19CLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19JLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19ULAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRW5kLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyc0VuZCwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMSwKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEYsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTIsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTMsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTQsCisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzUGFkZGluZywKKyAgICBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGLAorICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcgorfSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nLgorICovCit0eXBlZGVmIGVudW0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmcgeworICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZCwKKyAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnksCisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmFzZTY0Cit9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciBhIGR5bmFtaWNhbGx5IGdyb3dpbmcgc3RyaW5nLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrQ29udl9TdHJpbmcgeworICAgIGNoYXIgKnB0cjsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIHNpemVfdCBtYXhMZW5ndGg7CisgICAgc2l6ZV90IGxlbmd0aEluY3JlbWVudDsKK30gRndkTG9ja0NvbnZfU3RyaW5nX3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgcGVyLWZpbGUgc3RhdGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZSBjb252ZXJ0ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tDb252X1Nlc3Npb24geworICAgIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX3QgcGFyc2VyU3RhdGU7CisgICAgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX3Qgc2Nhbm5lclN0YXRlOworICAgIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV90IHNhdmVkU2Nhbm5lclN0YXRlOworICAgIG9mZjY0X3QgbnVtQ2hhcnNDb25zdW1lZDsKKyAgICBjaGFyIGRlbGltaXRlcltNQVhfREVMSU1JVEVSX0xFTkdUSF07CisgICAgc2l6ZV90IGRlbGltaXRlckxlbmd0aDsKKyAgICBzaXplX3QgZGVsaW1pdGVyTWF0Y2hQb3M7CisgICAgRndkTG9ja0NvbnZfU3RyaW5nX3QgbWltZUhlYWRlck5hbWU7CisgICAgRndkTG9ja0NvbnZfU3RyaW5nX3QgY29udGVudFR5cGU7CisgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfdCBjb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICB1bnNpZ25lZCBjaGFyIHNlc3Npb25LZXlbS0VZX1NJWkVdOworICAgIHZvaWQgKnBFbmNyeXB0ZWRTZXNzaW9uS2V5OworICAgIHNpemVfdCBlbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoOworICAgIEFFU19LRVkgZW5jcnlwdGlvblJvdW5kS2V5czsKKyAgICBITUFDX0NUWCBzaWduaW5nQ29udGV4dDsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlcltUT1BfSEVBREVSX1NJWkVdOworICAgIHVuc2lnbmVkIGNoYXIgY291bnRlcltBRVNfQkxPQ0tfU0laRV07CisgICAgdW5zaWduZWQgY2hhciBrZXlTdHJlYW1bQUVTX0JMT0NLX1NJWkVdOworICAgIGludCBrZXlTdHJlYW1JbmRleDsKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplOworICAgIHNpemVfdCBkYXRhT2Zmc2V0OworICAgIHNpemVfdCBudW1EYXRhQnl0ZXM7Cit9IEZ3ZExvY2tDb252X1Nlc3Npb25fdDsKKworc3RhdGljIEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqc2Vzc2lvblB0cnNbTUFYX05VTV9TRVNTSU9OU10gPSB7IE5VTEwgfTsKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzZXNzaW9uQWNxdWlzaXRpb25NdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyBjb25zdCBGd2RMb2NrQ29udl9TdHJpbmdfdCBudWxsU3RyaW5nID0geyBOVUxMLCAwLCAwLCBTVFJJTkdfTEVOR1RIX0lOQ1JFTUVOVCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0b3BIZWFkZXJUZW1wbGF0ZVtdID0KKyAgICB7ICdGJywgJ1cnLCAnTCcsICdLJywgRldEX0xPQ0tfVkVSU0lPTiwgRldEX0xPQ0tfU1VCRk9STUFULCBVU0FHRV9SRVNUUklDVElPTl9GTEFHUyB9OworCitzdGF0aWMgY29uc3QgY2hhciBzdHJDb250ZW50W10gPSAiY29udGVudC0iOworc3RhdGljIGNvbnN0IGNoYXIgc3RyVHlwZVtdID0gInR5cGUiOworc3RhdGljIGNvbnN0IGNoYXIgc3RyVHJhbnNmZXJFbmNvZGluZ1tdID0gInRyYW5zZmVyLWVuY29kaW5nIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0clRleHRQbGFpbltdID0gInRleHQvcGxhaW4iOworc3RhdGljIGNvbnN0IGNoYXIgc3RyQXBwbGljYXRpb25WbmRPbWFEcm1SaWdodHNYbWxbXSA9ICJhcHBsaWNhdGlvbi92bmQub21hLmRybS5yaWdodHMreG1sIjsKK3N0YXRpYyBjb25zdCBjaGFyIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtQ29udGVudFtdID0gImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLmNvbnRlbnQiOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IHN0cmxlbkNvbnRlbnQgPSBzaXplb2Ygc3RyQ29udGVudCAtIDE7CitzdGF0aWMgY29uc3Qgc2l6ZV90IHN0cmxlblRleHRQbGFpbiA9IHNpemVvZiBzdHJUZXh0UGxhaW4gLSAxOworCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYmFzZTY0VmFsdWVzW10gPSB7CisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgNjMsCisgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0yLCAtMSwgLTEsCisgICAgLTEsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgLTEsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsCisgICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxCit9OworCisvKioKKyAqIEFjcXVpcmVzIGFuIHVudXNlZCBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9BY3F1aXJlU2Vzc2lvbigpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gLTE7CisgICAgaW50IGk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VTU0lPTlM7ICsraSkgeworICAgICAgICBpZiAoc2Vzc2lvblB0cnNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgc2Vzc2lvblB0cnNbaV0gPSBtYWxsb2Moc2l6ZW9mICpzZXNzaW9uUHRyc1tpXSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvblB0cnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBzZXNzaW9uIElEIGlzIGluIHJhbmdlIGFuZCBjdXJyZW50bHkgaW4gdXNlLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklEIEEgc2Vzc2lvbiBJRC4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNlc3Npb24gSUQgaXMgaW4gcmFuZ2UgYW5kIGN1cnJlbnRseSBpbiB1c2UuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNWYWxpZFNlc3Npb24oaW50IHNlc3Npb25JZCkgeworICAgIHJldHVybiAwIDw9IHNlc3Npb25JZCAmJiBzZXNzaW9uSWQgPCBNQVhfTlVNX1NFU1NJT05TICYmIHNlc3Npb25QdHJzW3Nlc3Npb25JZF0gIT0gTlVMTDsKK30KKworLyoqCisgKiBSZWxlYXNlcyBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklEIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0NvbnZfUmVsZWFzZVNlc3Npb24oaW50IHNlc3Npb25JZCkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgIGFzc2VydChGd2RMb2NrQ29udl9Jc1ZhbGlkU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICBtZW1zZXQoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSwgMCwgc2l6ZW9mICpzZXNzaW9uUHRyc1tzZXNzaW9uSWRdKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdKTsKKyAgICBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdID0gTlVMTDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworfQorCisvKioKKyAqIERlcml2ZXMgY3J5cHRvZ3JhcGhpY2FsbHkgaW5kZXBlbmRlbnQga2V5cyBmb3IgZW5jcnlwdGlvbiBhbmQgc2lnbmluZyBmcm9tIHRoZSBzZXNzaW9uIGtleS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwU2Vzc2lvbiBBIHJlZmVyZW5jZSB0byBhIGNvbnZlcnRlciBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9EZXJpdmVLZXlzKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgc3RydWN0IEZ3ZExvY2tDb252X0Rlcml2ZUtleXNfRGF0YSB7CisgICAgICAgIEFFU19LRVkgc2Vzc2lvblJvdW5kS2V5czsKKyAgICAgICAgdW5zaWduZWQgY2hhciB2YWx1ZVtLRVlfU0laRV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIga2V5W0tFWV9TSVpFXTsKKyAgICB9ICpwRGF0YSA9IG1hbGxvYyhzaXplb2YgKnBEYXRhKTsKKyAgICBpZiAocERhdGEgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocFNlc3Npb24tPnNlc3Npb25LZXksIEtFWV9TSVpFX0lOX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEVuY3J5cHQgdGhlIDE2LWJ5dGUgdmFsdWUgezAsIDAsIC4uLiwgMH0gdG8gcHJvZHVjZSB0aGUgZW5jcnlwdGlvbiBrZXkuCisgICAgICAgICAgICBtZW1zZXQocERhdGEtPnZhbHVlLCAwLCBLRVlfU0laRSk7CisgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShwRGF0YS0+a2V5LCBLRVlfU0laRV9JTl9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZXNzaW9uLT5lbmNyeXB0aW9uUm91bmRLZXlzKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MSwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBzaWduaW5nIGtleS4KKyAgICAgICAgICAgICAgICArK3BEYXRhLT52YWx1ZVswXTsKKyAgICAgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICAgICAgSE1BQ19DVFhfaW5pdCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPmtleSwgS0VZX1NJWkUsIEVWUF9zaGExKCksIE5VTEwpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocERhdGEsIDAsIHNpemVvZiBwRGF0YSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBhIGJvdW5kYXJ5LiBOb3RlIHRoYXQgdGhlIGJvdW5kYXJ5IG1heSBjb250YWluCisgKiBsZWFkaW5nIGFuZCBpbnRlcm5hbCBzcGFjZXMuCisgKgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgYm91bmRhcnkuCisgKi8KK3N0YXRpYyBpbnQgRndkTG9ja0NvbnZfSXNCb3VuZGFyeUNoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIGlzYWxudW0oY2gpIHx8IGNoID09ICdcJycgfHwKKyAgICAgICAgICAgIGNoID09ICcoJyB8fCBjaCA9PSAnKScgfHwgY2ggPT0gJysnIHx8IGNoID09ICdfJyB8fCBjaCA9PSAnLCcgfHwgY2ggPT0gJy0nIHx8CisgICAgICAgICAgICBjaCA9PSAnLicgfHwgY2ggPT0gJy8nIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnPScgfHwgY2ggPT0gJz8nIHx8IGNoID09ICcgJzsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBzaG91bGQgYmUgY29uc2lkZXJlZCB3aGl0ZXNwYWNlLCB1c2luZyBhIG5hcnJvd2VyIGRlZmluaXRpb24KKyAqIHRoYW4gdGhlIHN0YW5kYXJkLWxpYnJhcnkgaXNzcGFjZSgpIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBzaG91bGQgYmUgY29uc2lkZXJlZCB3aGl0ZXNwYWNlLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShpbnQgY2gpIHsKKyAgICByZXR1cm4gY2ggPT0gJyAnIHx8IGNoID09ICdcdCc7Cit9CisKKy8qKgorICogUmVtb3ZlcyB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgZGVsaW1pdGVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfUmlnaHRUcmltRGVsaW1pdGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICB3aGlsZSAocFNlc3Npb24tPmRlbGltaXRlckxlbmd0aCA+IDQgJiYKKyAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoIC0gMV0gPT0gJyAnKSB7CisgICAgICAgIC0tcFNlc3Npb24tPmRlbGltaXRlckxlbmd0aDsKKyAgICB9CisgICAgaWYgKHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPiA0KSB7CisgICAgICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7CisgICAgfQorICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7Cit9CisKKy8qKgorICogTWF0Y2hlcyB0aGUgb3BlbiBkZWxpbWl0ZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfTWF0Y2hPcGVuRGVsaW1pdGVyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1NlY29uZERhc2g7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgLy8gVGhlIGRlbGltaXRlciBzdGFydHMgd2l0aCAiXHJcbi0tIiAodGhlIG9wZW4gZGVsaW1pdGVyIG1heSBvbWl0IHRoZSBpbml0aWFsICJcclxuIikuCisgICAgICAgICAgICAvLyBUaGUgcmVzdCBpcyB0aGUgdXNlci1kZWZpbmVkIGJvdW5kYXJ5IHRoYXQgc2hvdWxkIGNvbWUgbmV4dC4KKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJbMF0gPSAnXHInOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclsxXSA9ICdcbic7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyWzJdID0gJy0nOworICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlclszXSA9ICctJzsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGggPSA0OworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5OworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOgorICAgICAgICBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY6CisgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRmlyc3REYXNoOworICAgICAgICB9IGVsc2UgaWYgKGNoICE9ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5OgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCb3VuZGFyeUNoYXIoY2gpKSB7CisgICAgICAgICAgICAvLyBUaGUgYm91bmRhcnkgbWF5IGNvbnRhaW4gbGVhZGluZyBhbmQgaW50ZXJuYWwgc3BhY2VzLCBzbyB0cmFpbGluZyBzcGFjZXMgd2lsbCBhbHNvIGJlCisgICAgICAgICAgICAvLyBtYXRjaGVkIGhlcmUuIFRoZXNlIHdpbGwgYmUgcmVtb3ZlZCBsYXRlci4KKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+ZGVsaW1pdGVyTGVuZ3RoIDwgTUFYX0RFTElNSVRFUl9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGgrK10gPSBjaDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JpZ2h0VHJpbURlbGltaXRlcihwU2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCb3VuZGFyeUVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SaWdodFRyaW1EZWxpbWl0ZXIocFNlc3Npb24pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U6CisgICAgICAgIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQm91bmRhcnlFbmQ7CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0JvdW5kYXJ5RW5kOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNNaW1lSGVhZGVyczsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyTmFtZVN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gY2hhcmFjdGVyIGlzIHZhbGlkIGluIGEgTUlNRSBoZWFkZXIgbmFtZS4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBNSU1FIGhlYWRlciBuYW1lLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzTWltZUhlYWRlck5hbWVDaGFyKGludCBjaCkgeworICAgIHJldHVybiBpc2dyYXBoKGNoKSAmJiBjaCAhPSAnOic7Cit9CisKKy8qKgorICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBNSU1FIGhlYWRlciB2YWx1ZS4KKyAqCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgdmFsaWQgaW4gYSBNSU1FIGhlYWRlciB2YWx1ZS4KKyAqLworc3RhdGljIGludCBGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJWYWx1ZUNoYXIoaW50IGNoKSB7CisgICAgcmV0dXJuIGlzZ3JhcGgoY2gpICYmIGNoICE9ICc7JzsKK30KKworLyoqCisgKiBBcHBlbmRzIGEgY2hhcmFjdGVyIHRvIHRoZSBzcGVjaWZpZWQgZHluYW1pY2FsbHkgZ3Jvd2luZyBzdHJpbmcuCisgKgorICogQHBhcmFtW2luLG91dF0gcFN0cmluZyBBIHJlZmVyZW5jZSB0byBhIGR5bmFtaWNhbGx5IGdyb3dpbmcgc3RyaW5nLgorICogQHBhcmFtW2luXSBjaCBUaGUgY2hhcmFjdGVyIHRvIGFwcGVuZC4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoRndkTG9ja0NvbnZfU3RyaW5nX3QgKnBTdHJpbmcsIGludCBjaCkgeworICAgIGlmIChwU3RyaW5nLT5sZW5ndGggPT0gcFN0cmluZy0+bWF4TGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBuZXdNYXhMZW5ndGggPSBwU3RyaW5nLT5tYXhMZW5ndGggKyBwU3RyaW5nLT5sZW5ndGhJbmNyZW1lbnQ7CisgICAgICAgIGNoYXIgKm5ld1B0ciA9IHJlYWxsb2MocFN0cmluZy0+cHRyLCBuZXdNYXhMZW5ndGggKyAxKTsKKyAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICB9CisgICAgICAgIHBTdHJpbmctPnB0ciA9IG5ld1B0cjsKKyAgICAgICAgcFN0cmluZy0+bWF4TGVuZ3RoID0gbmV3TWF4TGVuZ3RoOworICAgIH0KKyAgICBwU3RyaW5nLT5wdHJbcFN0cmluZy0+bGVuZ3RoKytdID0gY2g7CisgICAgcFN0cmluZy0+cHRyW3BTdHJpbmctPmxlbmd0aF0gPSAnXDAnOworICAgIHJldHVybiBGd2RMb2NrQ29udl9TdGF0dXNfT0s7Cit9CisKKy8qKgorICogQXR0ZW1wdHMgdG8gcmVjb2duaXplIHRoZSBNSU1FIGhlYWRlciBuYW1lIGFuZCBjaGFuZ2VzIHRoZSBzY2FubmVyIHN0YXRlIGFjY29yZGluZ2x5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfUmVjb2duaXplTWltZUhlYWRlck5hbWUoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbikgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBpZiAoc3RybmNtcChwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUucHRyLCBzdHJDb250ZW50LCBzdHJsZW5Db250ZW50KSA9PSAwKSB7CisgICAgICAgIGlmIChzdHJjbXAocFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLnB0ciArIHN0cmxlbkNvbnRlbnQsIHN0clR5cGUpID09IDApIHsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGVTdGFydDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUucHRyICsgc3RybGVuQ29udGVudCwgc3RyVHJhbnNmZXJFbmNvZGluZykgPT0gMCkgeworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9PQorICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdTdGFydDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEFwcGxpZXMgZGVmYXVsdHMgdG8gbWlzc2luZyBNSU1FIGhlYWRlciB2YWx1ZXMuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9BcHBseURlZmF1bHRzKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24pIHsKKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9PSBOVUxMKSB7CisgICAgICAgIC8vIENvbnRlbnQgdHlwZSBpcyBtaXNzaW5nOiBkZWZhdWx0IHRvICJ0ZXh0L3BsYWluIi4KKyAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciA9IG1hbGxvYyhzaXplb2Ygc3RyVGV4dFBsYWluKTsKKyAgICAgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgc3RyVGV4dFBsYWluLCBzaXplb2Ygc3RyVGV4dFBsYWluKTsKKyAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCA9IHN0cmxlblRleHRQbGFpbjsKKyAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLm1heExlbmd0aCA9IHN0cmxlblRleHRQbGFpbjsKKyAgICB9CisgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9PSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19VbmRlZmluZWQpIHsKKyAgICAgICAgLy8gQ29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBpcyBtaXNzaW5nOiBkZWZhdWx0IHRvIGJpbmFyeS4KKyAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUcmFuc2ZlckVuY29kaW5nID0gRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5OworICAgIH0KKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworfQorCisvKioKKyAqIFZlcmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgdHlwZSBpcyBzdXBwb3J0ZWQuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9WZXJpZnlDb250ZW50VHlwZShGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyLCBzdHJBcHBsaWNhdGlvblZuZE9tYURybVJpZ2h0c1htbCkgPT0gMCB8fAorICAgICAgICAgICAgICAgc3RyY21wKHBTZXNzaW9uLT5jb250ZW50VHlwZS5wdHIsIHN0ckFwcGxpY2F0aW9uVm5kT21hRHJtQ29udGVudCkgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRGaWxlRm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBXcml0ZXMgdGhlIGhlYWRlciBvZiB0aGUgb3V0cHV0IGZpbGUuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICovCitzdGF0aWMgRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfV3JpdGVIZWFkZXIoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCA+IFVDSEFSX01BWCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUgPSBPVVRQVVRfQlVGRkVSX1NJWkVfSU5DUkVNRU5UOworICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciA9IG1hbGxvYyhwU2Vzc2lvbi0+b3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgZW5jcnlwdGVkU2Vzc2lvbktleVBvcyA9IFRPUF9IRUFERVJfU0laRSArIHBTZXNzaW9uLT5jb250ZW50VHlwZS5sZW5ndGg7CisgICAgICAgICAgICBzaXplX3QgZGF0YVNpZ25hdHVyZVBvcyA9IGVuY3J5cHRlZFNlc3Npb25LZXlQb3MgKyBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aDsKKyAgICAgICAgICAgIHNpemVfdCBoZWFkZXJTaWduYXR1cmVQb3MgPSBkYXRhU2lnbmF0dXJlUG9zICsgU0hBMV9IQVNIX1NJWkU7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IGhlYWRlclNpZ25hdHVyZVBvcyArIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgbWVtY3B5KHBTZXNzaW9uLT50b3BIZWFkZXIsIHRvcEhlYWRlclRlbXBsYXRlLCBzaXplb2YgdG9wSGVhZGVyVGVtcGxhdGUpOworICAgICAgICAgICAgcFNlc3Npb24tPnRvcEhlYWRlcltDT05URU5UX1RZUEVfTEVOR1RIX1BPU10gPQorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoOworICAgICAgICAgICAgbWVtY3B5KHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLCBwU2Vzc2lvbi0+dG9wSGVhZGVyLCBUT1BfSEVBREVSX1NJWkUpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgKyBUT1BfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwgcFNlc3Npb24tPmNvbnRlbnRUeXBlLmxlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIGVuY3J5cHRlZFNlc3Npb25LZXlQb3MsCisgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LCBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgc2lnbmF0dXJlcyB0byBhbGwgemVyb3MgZm9yIG5vdzsgdGhleSB3aWxsIGhhdmUgdG8gYmUgdXBkYXRlZCBsYXRlci4KKyAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyICsgZGF0YVNpZ25hdHVyZVBvcywgMCwKKyAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSk7CisgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKilwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciArIGhlYWRlclNpZ25hdHVyZVBvcywgMCwKKyAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSk7CisKKyAgICAgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA9IHBTZXNzaW9uLT5kYXRhT2Zmc2V0OworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogTWF0Y2hlcyB0aGUgTUlNRSBoZWFkZXJzLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIEEgY2hhcmFjdGVyLgorICogQHBhcmFtW291dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2Vzcy4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9NYXRjaE1pbWVIZWFkZXJzKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICBzd2l0Y2ggKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQ6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJOYW1lQ2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5taW1lSGVhZGVyTmFtZS5sZW5ndGggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RyaW5nQXBwZW5kKCZwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUsIHRvbG93ZXIoY2gpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyc0VuZDsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWU6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJOYW1lQ2hhcihjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPm1pbWVIZWFkZXJOYW1lLCB0b2xvd2VyKGNoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9SZWNvZ25pemVNaW1lSGVhZGVyTmFtZShwU2Vzc2lvbik7CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlck5hbWVFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1JlY29nbml6ZU1pbWVIZWFkZXJOYW1lKHBTZXNzaW9uKTsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGVTdGFydDoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzTWltZUhlYWRlclZhbHVlQ2hhcihjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0cmluZ0FwcGVuZCgmcFNlc3Npb24tPmNvbnRlbnRUeXBlLCB0b2xvd2VyKGNoKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFR5cGU6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc01pbWVIZWFkZXJWYWx1ZUNoYXIoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdHJpbmdBcHBlbmQoJnBTZXNzaW9uLT5jb250ZW50VHlwZSwgdG9sb3dlcihjaCkpOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0NSOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdTdGFydDoKKyAgICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQV9PUl9JOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc3JyB8fCBjaCA9PSAnOCcpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQjsKKyAgICAgICAgfSBlbHNlIGlmICghRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfQV9PUl9JOgorICAgICAgICBpZiAoY2ggPT0gJ2knIHx8IGNoID09ICdJJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19OOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdhJyB8fCBjaCA9PSAnQScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX046CisgICAgICAgIGlmIChjaCA9PSAnbicgfHwgY2ggPT0gJ04nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0E7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19BOgorICAgICAgICBpZiAoY2ggPT0gJ2EnIHx8IGNoID09ICdBJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfUjoKKyAgICAgICAgaWYgKGNoID09ICdyJyB8fCBjaCA9PSAnUicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX1k6CisgICAgICAgIGlmIChjaCA9PSAneScgfHwgY2ggPT0gJ1knKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFRyYW5zZmVyRW5jb2RpbmcgPSBGd2RMb2NrQ29udl9Db250ZW50VHJhbnNmZXJFbmNvZGluZ19CaW5hcnk7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19TOgorICAgICAgICBpZiAoY2ggPT0gJ3MnIHx8IGNoID09ICdTJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfRToKKyAgICAgICAgaWYgKGNoID09ICdlJyB8fCBjaCA9PSAnRScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzY6CisgICAgICAgIGlmIChjaCA9PSAnNicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzXzQ6CisgICAgICAgIGlmIChjaCA9PSAnNCcpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0Jhc2U2NDsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0I6CisgICAgICAgIGlmIChjaCA9PSAnYicgfHwgY2ggPT0gJ0InKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzX0k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19JOgorICAgICAgICBpZiAoY2ggPT0gJ2knIHx8IGNoID09ICdJJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c19UOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2Rpbmc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNfVDoKKyAgICAgICAgaWYgKGNoID09ICd0JyB8fCBjaCA9PSAnVCcpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX0JpbmFyeTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDb250ZW50VHJhbnNmZXJFbmNvZGluZ0VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ29udGVudFRyYW5zZmVyRW5jb2RpbmdFbmQ6CisgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTEY7CisgICAgICAgIH0gZWxzZSBpZiAoRndkTG9ja0NvbnZfSXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJWYWx1ZUVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZENvbnRlbnRUcmFuc2ZlckVuY29kaW5nOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzTWltZUhlYWRlclZhbHVlRW5kOgorICAgICAgICBpZiAoY2ggPT0gJzsnKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQ1I7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNDUjoKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOgorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c01pbWVIZWFkZXJOYW1lU3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNNaW1lSGVhZGVyc0VuZDoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0FwcGx5RGVmYXVsdHMocFNlc3Npb24pOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9WZXJpZnlDb250ZW50VHlwZShwU2Vzc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlSGVhZGVyKHBTZXNzaW9uLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9PQorICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfQ29udGVudFRyYW5zZmVyRW5jb2RpbmdfQmluYXJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmluYXJ5RW5jb2RlZERhdGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNCYXNlNjRFbmNvZGVkRGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIEluY3JlbWVudHMgdGhlIGNvdW50ZXIsIHRyZWF0ZWQgYXMgYSAxNi1ieXRlIGxpdHRsZS1lbmRpYW4gbnVtYmVyLCBieSBvbmUuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqLworc3RhdGljIHZvaWQgRndkTG9ja0NvbnZfSW5jcmVtZW50Q291bnRlcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlICgoKytwU2Vzc2lvbi0+Y291bnRlcltpXSA9PSAwKSAmJiAoKytpIDwgQUVTX0JMT0NLX1NJWkUpKQorICAgICAgICA7Cit9CisKKy8qKgorICogRW5jcnlwdHMgdGhlIGdpdmVuIGNoYXJhY3RlciBhbmQgd3JpdGVzIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgY29udmVydGVyIHNlc3Npb24uCisgKiBAcGFyYW1baW5dIGNoIFRoZSBjaGFyYWN0ZXIgdG8gZW5jcnlwdCBhbmQgd3JpdGUuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihGd2RMb2NrQ29udl9TZXNzaW9uX3QgKnBTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIGlmIChwT3V0cHV0LT5mcm9tQ29udmVydERhdGEubnVtQnl0ZXMgPT0gcFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUpIHsKKyAgICAgICAgdm9pZCAqcEJ1ZmZlcjsKKyAgICAgICAgcFNlc3Npb24tPm91dHB1dEJ1ZmZlclNpemUgKz0gT1VUUFVUX0JVRkZFUl9TSVpFX0lOQ1JFTUVOVDsKKyAgICAgICAgcEJ1ZmZlciA9IHJlYWxsb2MocE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIsIHBTZXNzaW9uLT5vdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEucEJ1ZmZlciA9IHBCdWZmZXI7CisgICAgfQorICAgIGlmICgrK3BTZXNzaW9uLT5rZXlTdHJlYW1JbmRleCA9PSBBRVNfQkxPQ0tfU0laRSkgeworICAgICAgICBGd2RMb2NrQ29udl9JbmNyZW1lbnRDb3VudGVyKHBTZXNzaW9uKTsKKyAgICAgICAgcFNlc3Npb24tPmtleVN0cmVhbUluZGV4ID0gMDsKKyAgICB9CisgICAgaWYgKHBTZXNzaW9uLT5rZXlTdHJlYW1JbmRleCA9PSAwKSB7CisgICAgICAgIEFFU19lbmNyeXB0KHBTZXNzaW9uLT5jb3VudGVyLCBwU2Vzc2lvbi0+a2V5U3RyZWFtLCAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpOworICAgIH0KKyAgICBjaCBePSBwU2Vzc2lvbi0+a2V5U3RyZWFtW3BTZXNzaW9uLT5rZXlTdHJlYW1JbmRleF07CisgICAgKCh1bnNpZ25lZCBjaGFyICopcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIpW3BPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcysrXSA9IGNoOworICAgICsrcFNlc3Npb24tPm51bURhdGFCeXRlczsKKyAgICByZXR1cm4gRndkTG9ja0NvbnZfU3RhdHVzX09LOworfQorCisvKioKKyAqIE1hdGNoZXMgYmluYXJ5LWVuY29kZWQgY29udGVudCBkYXRhIGFuZCBlbmNyeXB0cyBpdCwgd2hpbGUgbG9va2luZyBvdXQgZm9yIHRoZSBjbG9zZSBkZWxpbWl0ZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoQmluYXJ5RW5jb2RlZERhdGEoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTE6CisgICAgICAgIGlmIChjaCAhPSBwU2Vzc2lvbi0+ZGVsaW1pdGVyW3BTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvc10pIHsKKyAgICAgICAgICAgIC8vIFRoZSBwYXJ0aWFsIG1hdGNoIG9mIHRoZSBkZWxpbWl0ZXIgdHVybmVkIG91dCB0byBiZSBzcHVyaW91cy4gRmx1c2ggdGhlIG1hdGNoZWQgYnl0ZXMKKyAgICAgICAgICAgIC8vIHRvIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCBzdGFydCBvdmVyLgorICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5kZWxpbWl0ZXJbaV0sIHBPdXRwdXQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggIT0gcFNlc3Npb24tPmRlbGltaXRlcltwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3NdKSB7CisgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIgaXNuJ3QgcGFydCBvZiB0aGUgZGVsaW1pdGVyLiBXcml0ZSBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICB9IGVsc2UgaWYgKCsrcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID09IHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIFRoZSBlbnRpcmUgZGVsaW1pdGVyIGhhcyBiZWVuIG1hdGNoZWQuIFRoZSBvbmx5IHZhbGlkIGNoYXJhY3RlcnMgbm93IGFyZSB0aGUgIi0tIgorICAgICAgICAgICAgLy8gdGhhdCBjb21wbGV0ZSB0aGUgY2xvc2UgZGVsaW1pdGVyIChubyBtb3JlIG1lc3NhZ2UgcGFydHMgYXJlIGV4cGVjdGVkKS4KKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBDaGVja3Mgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBiYXNlNjQtZW5jb2RlZCBkYXRhLgorICoKKyAqIEBwYXJhbVtpbl0gY2ggVGhlIGNoYXJhY3RlciB0byBjaGVjay4KKyAqCisgKiBAcmV0dXJuIEEgQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGdpdmVuIGNoYXJhY3RlciBpcyB2YWxpZCBpbiBiYXNlNjQtZW5jb2RlZCBkYXRhLgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihpbnQgY2gpIHsKKyAgICByZXR1cm4gMCA8PSBjaCAmJiBjaCA8PSAneicgJiYgYmFzZTY0VmFsdWVzW2NoXSA+PSAwOworfQorCisvKioKKyAqIE1hdGNoZXMgYmFzZTY0LWVuY29kZWQgY29udGVudCBkYXRhIGFuZCBlbmNyeXB0cyBpdCwgd2hpbGUgbG9va2luZyBvdXQgZm9yIHRoZSBjbG9zZSBkZWxpbWl0ZXIuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X01hdGNoQmFzZTY0RW5jb2RlZERhdGEoRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgIHN3aXRjaCAocFNlc3Npb24tPnNjYW5uZXJTdGF0ZSkgeworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTE6CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMV9BZnRlckNSTEY6CisgICAgICAgIGlmIChGd2RMb2NrQ29udl9Jc0Jhc2U2NENoYXIoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+Y2ggPSBiYXNlNjRWYWx1ZXNbY2hdIDw8IDI7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTI7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPT0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTFfQWZ0ZXJDUkxGKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID0gMzsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzRGVsaW1pdGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIUZ3ZExvY2tDb252X0lzV2hpdGVzcGFjZShjaCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0J5dGUyOgorICAgICAgICBpZiAoRndkTG9ja0NvbnZfSXNCYXNlNjRDaGFyKGNoKSkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNoIHw9IGJhc2U2NFZhbHVlc1tjaF0gPj4gNDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1dyaXRlRW5jcnlwdGVkQ2hhcihwU2Vzc2lvbiwgcFNlc3Npb24tPmNoLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNoID0gYmFzZTY0VmFsdWVzW2NoXSA8PCA0OworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlMzoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCB8PSBiYXNlNjRWYWx1ZXNbY2hdID4+IDI7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Xcml0ZUVuY3J5cHRlZENoYXIocFNlc3Npb24sIHBTZXNzaW9uLT5jaCwgcE91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jaCA9IGJhc2U2NFZhbHVlc1tjaF0gPDwgNjsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNjYW5uZXJTdGF0ZTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNQYWRkaW5nOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNCeXRlNDoKKyAgICAgICAgaWYgKEZ3ZExvY2tDb252X0lzQmFzZTY0Q2hhcihjaCkpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5jaCB8PSBiYXNlNjRWYWx1ZXNbY2hdOworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfV3JpdGVFbmNyeXB0ZWRDaGFyKHBTZXNzaW9uLCBwU2Vzc2lvbi0+Y2gsIHBPdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzQnl0ZTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnNhdmVkU2Nhbm5lclN0YXRlID0gcFNlc3Npb24tPnNjYW5uZXJTdGF0ZTsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnPScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlOworICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNMRjoKKyAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBwU2Vzc2lvbi0+c2F2ZWRTY2FubmVyU3RhdGU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNQYWRkaW5nOgorICAgICAgICBpZiAoY2ggPT0gJz0nKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2U6CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNXaGl0ZXNwYWNlX0FmdGVyQ1JMRjoKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zYXZlZFNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c1doaXRlc3BhY2VfQWZ0ZXJDUkxGOworICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0xGOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPT0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZV9BZnRlckNSTEYpIHsKKyAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZGVsaW1pdGVyTWF0Y2hQb3MgPSAzOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNEZWxpbWl0ZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChGd2RMb2NrQ29udl9Jc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+c2Nhbm5lclN0YXRlID0gRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzV2hpdGVzcGFjZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0RlbGltaXRlcjoKKyAgICAgICAgaWYgKGNoICE9IHBTZXNzaW9uLT5kZWxpbWl0ZXJbcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zXSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9IGVsc2UgaWYgKCsrcFNlc3Npb24tPmRlbGltaXRlck1hdGNoUG9zID09IHBTZXNzaW9uLT5kZWxpbWl0ZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNGaXJzdERhc2g6CisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgIHBTZXNzaW9uLT5zY2FubmVyU3RhdGUgPSBGd2RMb2NrQ29udl9TY2FubmVyU3RhdGVfV2FudHNTZWNvbmREYXNoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfU2Nhbm5lclN0YXRlX1dhbnRzU2Vjb25kRGFzaDoKKyAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19TeW50YXhFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBQdXNoZXMgYSBzaW5nbGUgY2hhcmFjdGVyIGludG8gdGhlIGNvbnZlcnRlcidzIHN0YXRlIG1hY2hpbmUuCisgKgorICogQHBhcmFtW2luLG91dF0gcFNlc3Npb24gQSByZWZlcmVuY2UgdG8gYSBjb252ZXJ0ZXIgc2Vzc2lvbi4KKyAqIEBwYXJhbVtpbl0gY2ggQSBjaGFyYWN0ZXIuCisgKiBAcGFyYW1baW4sb3V0XSBwT3V0cHV0IFRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqLworc3RhdGljIEZ3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X1B1c2hDaGFyKEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgICsrcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQ7CisgICAgc3dpdGNoIChwU2Vzc2lvbi0+cGFyc2VyU3RhdGUpIHsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzT3BlbkRlbGltaXRlcjoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hPcGVuRGVsaW1pdGVyKHBTZXNzaW9uLCBjaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNNaW1lSGVhZGVyczoKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfTWF0Y2hNaW1lSGVhZGVycyhwU2Vzc2lvbiwgY2gsIHBPdXRwdXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZ3ZExvY2tDb252X1BhcnNlclN0YXRlX1dhbnRzQmluYXJ5RW5jb2RlZERhdGE6CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X01hdGNoQmluYXJ5RW5jb2RlZERhdGEocFNlc3Npb24sIGNoLCBwT3V0cHV0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9XYW50c0Jhc2U2NEVuY29kZWREYXRhOgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9NYXRjaEJhc2U2NEVuY29kZWREYXRhKHBTZXNzaW9uLCBjaCwgcE91dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfRG9uZToKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX09LOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfUHJvZ3JhbUVycm9yOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfT3BlblNlc3Npb24oaW50ICpwU2Vzc2lvbklkLCBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCkgeworICAgIEZ3ZExvY2tDb252X1N0YXR1c190IHN0YXR1czsKKyAgICBpZiAocFNlc3Npb25JZCA9PSBOVUxMIHx8IHBPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgICpwU2Vzc2lvbklkID0gRndkTG9ja0NvbnZfQWNxdWlyZVNlc3Npb24oKTsKKyAgICAgICAgaWYgKCpwU2Vzc2lvbklkIDwgMCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9uczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1sqcFNlc3Npb25JZF07CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCA9IEZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aChLRVlfU0laRSk7CisgICAgICAgICAgICBpZiAocFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPCBBRVNfQkxPQ0tfU0laRSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXkgaXMgdXNlZCBhcyB0aGUgQ1RSLW1vZGUgbm9uY2UsIHNvIGl0IG11c3QgYmUgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBBRVMgYmxvY2suCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX1Byb2dyYW1FcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5ID0gbWFsbG9jKHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRndkTG9ja0dsdWVfR2V0UmFuZG9tTnVtYmVyKHBTZXNzaW9uLT5zZXNzaW9uS2V5LCBLRVlfU0laRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19SYW5kb21OdW1iZXJHZW5lcmF0aW9uRmFpbGVkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFGd2RMb2NrR2x1ZV9FbmNyeXB0S2V5KHBTZXNzaW9uLT5zZXNzaW9uS2V5LCBLRVlfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X0Rlcml2ZUtleXMocFNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocFNlc3Npb24tPnNlc3Npb25LZXksIDAsIEtFWV9TSVpFKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFNlc3Npb24tPmNvdW50ZXIsIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSwgQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnBhcnNlclN0YXRlID0gRndkTG9ja0NvbnZfUGFyc2VyU3RhdGVfV2FudHNPcGVuRGVsaW1pdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnNjYW5uZXJTdGF0ZSA9IEZ3ZExvY2tDb252X1NjYW5uZXJTdGF0ZV9XYW50c0ZpcnN0RGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5udW1DaGFyc0NvbnN1bWVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5kZWxpbWl0ZXJNYXRjaFBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUgPSBudWxsU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlID0gbnVsbFN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5jb250ZW50VHJhbnNmZXJFbmNvZGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nX1VuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5rZXlTdHJlYW1JbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLnBCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNvbnZlcnREYXRhLmVycm9yUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1JlbGVhc2VTZXNzaW9uKCpwU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAqcFNlc3Npb25JZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnREYXRhKGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFGd2RMb2NrQ29udl9Jc1ZhbGlkU2Vzc2lvbihzZXNzaW9uSWQpIHx8IHBCdWZmZXIgPT0gTlVMTCB8fCBwT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgRndkTG9ja0NvbnZfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgcFNlc3Npb24tPm51bURhdGFCeXRlcyA9IDA7CisgICAgICAgIHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA9IDA7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQnl0ZXM7ICsraSkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfUHVzaENoYXIocFNlc3Npb24sICgoY2hhciAqKXBCdWZmZXIpW2ldLCBwT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfT0spIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0YSBzaWduYXR1cmUuCisgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgJigodW5zaWduZWQgY2hhciAqKXBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyKVtwU2Vzc2lvbi0+ZGF0YU9mZnNldF0sCisgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+bnVtRGF0YUJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yKSB7CisgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ29udmVydERhdGEuZXJyb3JQb3MgPSBwU2Vzc2lvbi0+bnVtQ2hhcnNDb25zdW1lZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oaW50IHNlc3Npb25JZCwgRndkTG9ja0NvbnZfT3V0cHV0X3QgKnBPdXRwdXQpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKCFGd2RMb2NrQ29udl9Jc1ZhbGlkU2Vzc2lvbihzZXNzaW9uSWQpIHx8IHBPdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tDb252X1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBmcmVlKHBPdXRwdXQtPmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyKTsKKyAgICAgICAgaWYgKHBTZXNzaW9uLT5wYXJzZXJTdGF0ZSAhPSBGd2RMb2NrQ29udl9QYXJzZXJTdGF0ZV9Eb25lKSB7CisgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLmVycm9yUG9zID0gcFNlc3Npb24tPm51bUNoYXJzQ29uc3VtZWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGaW5hbGl6ZSB0aGUgZGF0YSBzaWduYXR1cmUuCisgICAgICAgICAgICBzaXplX3Qgc2lnbmF0dXJlU2l6ZTsKKyAgICAgICAgICAgIEhNQUNfRmluYWwoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5zaWduYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgICAgICBpZiAoc2lnbmF0dXJlU2l6ZSAhPSBTSEExX0hBU0hfU0laRSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgaGVhZGVyIHNpZ25hdHVyZSwgd2hpY2ggaXMgYSBzaWduYXR1cmUgb2YgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgZGF0YSBzaWduYXR1cmUuCisgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIE5VTEwsIEtFWV9TSVpFLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwU2Vzc2lvbi0+dG9wSGVhZGVyLCBUT1BfSEVBREVSX1NJWkUpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsICh1bnNpZ25lZCBjaGFyICopcFNlc3Npb24tPmNvbnRlbnRUeXBlLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBITUFDX1VwZGF0ZSgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGgpOworICAgICAgICAgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBPdXRwdXQtPmZyb21DbG9zZVNlc3Npb24uc2lnbmF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsICZwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlc1tzaWduYXR1cmVTaXplXSwgJnNpZ25hdHVyZVNpemUpOworICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmVTaXplICE9IFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dC0+ZnJvbUNsb3NlU2Vzc2lvbi5maWxlT2Zmc2V0ID0gVE9QX0hFQURFUl9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+Y29udGVudFR5cGUubGVuZ3RoICsgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwT3V0cHV0LT5mcm9tQ2xvc2VTZXNzaW9uLmVycm9yUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwU2Vzc2lvbi0+bWltZUhlYWRlck5hbWUucHRyKTsKKyAgICAgICAgZnJlZShwU2Vzc2lvbi0+Y29udGVudFR5cGUucHRyKTsKKyAgICAgICAgZnJlZShwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXkpOworICAgICAgICBITUFDX0NUWF9jbGVhbnVwKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQpOworICAgICAgICBGd2RMb2NrQ29udl9SZWxlYXNlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0T3BlbkZpbGUoaW50IGlucHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfUmVhZEZ1bmNfdCAqZnBSZWFkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfV3JpdGVGdW5jX3QgKmZwV3JpdGVGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0xTZWVrRnVuY190ICpmcExTZWVrRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90ICpwRXJyb3JQb3MpIHsKKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICpwRXJyb3JQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9CisgICAgaWYgKGZwUmVhZEZ1bmMgPT0gTlVMTCB8fCBmcFdyaXRlRnVuYyA9PSBOVUxMIHx8IGZwTFNlZWtGdW5jID09IE5VTEwgfHwgaW5wdXRGaWxlRGVzYyA8IDAgfHwKKyAgICAgICAgb3V0cHV0RmlsZURlc2MgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqcFJlYWRCdWZmZXIgPSBtYWxsb2MoUkVBRF9CVUZGRVJfU0laRSk7CisgICAgICAgIGlmIChwUmVhZEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgc2Vzc2lvbklkOworICAgICAgICAgICAgRndkTG9ja0NvbnZfT3V0cHV0X3Qgb3V0cHV0OworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfT3BlblNlc3Npb24oJnNlc3Npb25JZCwgJm91dHB1dCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkOworICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X1N0YXR1c190IGNsb3NlU3RhdHVzOworICAgICAgICAgICAgICAgIHdoaWxlICgobnVtQnl0ZXNSZWFkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwUmVhZEZ1bmMoaW5wdXRGaWxlRGVzYywgcFJlYWRCdWZmZXIsIFJFQURfQlVGRkVSX1NJWkUpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfQ29udmVydERhdGEoc2Vzc2lvbklkLCBwUmVhZEJ1ZmZlciwgKHNpemVfdCludW1CeXRlc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5mcm9tQ29udmVydERhdGEucEJ1ZmZlciAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZwV3JpdGVGdW5jKG91dHB1dEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5wQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5udW1CeXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUJ5dGVzV3JpdHRlbiAhPSAoc3NpemVfdClvdXRwdXQuZnJvbUNvbnZlcnREYXRhLm51bUJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IgJiYgcEVycm9yUG9zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEVycm9yUG9zID0gb3V0cHV0LmZyb21Db252ZXJ0RGF0YS5lcnJvclBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBlbmQgd2hpbGUKKyAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVJlYWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvc2VTdGF0dXMgPSBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb24oc2Vzc2lvbklkLCAmb3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEZ3ZExvY2tDb252X1N0YXR1c19PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VTdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2VTdGF0dXMgPT0gRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yICYmIHBFcnJvclBvcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBFcnJvclBvcyA9IG91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLmVycm9yUG9zOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2xvc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnBMU2Vla0Z1bmMob3V0cHV0RmlsZURlc2MsIG91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnBXcml0ZUZ1bmMob3V0cHV0RmlsZURlc2MsIG91dHB1dC5mcm9tQ2xvc2VTZXNzaW9uLnNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldEX0xPQ0tfU0lHTkFUVVJFU19TSVpFKSAhPSBGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocFJlYWRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0Z3ZExvY2tDb252X1N0YXR1c190IEZ3ZExvY2tDb252X0NvbnZlcnRGaWxlKGNvbnN0IGNoYXIgKnBJbnB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcE91dHB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAqcEVycm9yUG9zKSB7CisgICAgRndkTG9ja0NvbnZfU3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChwRXJyb3JQb3MgIT0gTlVMTCkgeworICAgICAgICAqcEVycm9yUG9zID0gSU5WQUxJRF9PRkZTRVQ7CisgICAgfQorICAgIGlmIChwSW5wdXRGaWxlbmFtZSA9PSBOVUxMIHx8IHBPdXRwdXRGaWxlbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGlucHV0RmlsZURlc2MgPSBvcGVuKHBJbnB1dEZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgICAgIGlmIChpbnB1dEZpbGVEZXNjIDwgMCkgeworICAgICAgICAgICAgc3RhdHVzID0gRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVOb3RGb3VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBvdXRwdXRGaWxlRGVzYyA9IG9wZW4ocE91dHB1dEZpbGVuYW1lLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlRGVzYyA8IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZUNyZWF0aW9uRmFpbGVkOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGd2RMb2NrQ29udl9Db252ZXJ0T3BlbkZpbGUoaW5wdXRGaWxlRGVzYywgcmVhZCwgb3V0cHV0RmlsZURlc2MsIHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2VlazY0LCBwRXJyb3JQb3MpOworICAgICAgICAgICAgICAgIGlmIChjbG9zZShvdXRwdXRGaWxlRGVzYykgPT0gMCAmJiBzdGF0dXMgIT0gRndkTG9ja0NvbnZfU3RhdHVzX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZShwT3V0cHV0RmlsZW5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKWNsb3NlKGlucHV0RmlsZURlc2MpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuaCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9Gd2RMb2NrQ29udi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMGMwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb252ZXJ0ZXIvRndkTG9ja0NvbnYuaApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19GV0RMT0NLQ09OVl9IX18KKyNkZWZpbmUgX19GV0RMT0NLQ09OVl9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qKgorICogVGhlIHNpemUgb2YgdGhlIGRhdGEgYW5kIGhlYWRlciBzaWduYXR1cmVzIGNvbWJpbmVkLiBUaGUgc2lnbmF0dXJlcyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlciBpbgorICogdGhlIHByb2R1Y2VkIG91dHB1dCBmaWxlLgorICovCisjZGVmaW5lIEZXRF9MT0NLX1NJR05BVFVSRVNfU0laRSAoMiAqIDIwKQorCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIG91dHB1dCBmcm9tIEZ3ZExvY2tDb252X0NvbnZlcnREYXRhLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrQ29udl9Db252ZXJ0RGF0YV9PdXRwdXQgeworICAgIC8vLyBUaGUgY29udmVydGVkIGRhdGEuCisgICAgdm9pZCAqcEJ1ZmZlcjsKKworICAgIC8vLyBUaGUgc2l6ZSBvZiB0aGUgY29udmVydGVkIGRhdGEuCisgICAgc2l6ZV90IG51bUJ5dGVzOworCisgICAgLy8vIFRoZSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaW4gdGhlIGNhc2Ugb2YgYSBzeW50YXggZXJyb3IuCisgICAgb2ZmNjRfdCBlcnJvclBvczsKK30gRndkTG9ja0NvbnZfQ29udmVydERhdGFfT3V0cHV0X3Q7CisKKy8qKgorICogRGF0YSB0eXBlIGZvciB0aGUgb3V0cHV0IGZyb20gRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBGd2RMb2NrQ29udl9DbG9zZVNlc3Npb25fT3V0cHV0IHsKKyAgICAvLy8gVGhlIGZpbmFsIHNldCBvZiBzaWduYXR1cmVzLgorICAgIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlc1tGV0RfTE9DS19TSUdOQVRVUkVTX1NJWkVdOworCisgICAgLy8vIFRoZSBvZmZzZXQgaW4gdGhlIHByb2R1Y2VkIG91dHB1dCBmaWxlIHdoZXJlIHRoZSBzaWduYXR1cmVzIGFyZSBsb2NhdGVkLgorICAgIG9mZjY0X3QgZmlsZU9mZnNldDsKKworICAgIC8vLyBUaGUgZmlsZSBwb3NpdGlvbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQsIGluIHRoZSBjYXNlIG9mIGEgc3ludGF4IGVycm9yLgorICAgIG9mZjY0X3QgZXJyb3JQb3M7Cit9IEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbl9PdXRwdXRfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29udmVyc2lvbiBwcm9jZXNzLgorICovCit0eXBlZGVmIHVuaW9uIEZ3ZExvY2tDb252X091dHB1dCB7CisgICAgRndkTG9ja0NvbnZfQ29udmVydERhdGFfT3V0cHV0X3QgZnJvbUNvbnZlcnREYXRhOworICAgIEZ3ZExvY2tDb252X0Nsb3NlU2Vzc2lvbl9PdXRwdXRfdCBmcm9tQ2xvc2VTZXNzaW9uOworfSBGd2RMb2NrQ29udl9PdXRwdXRfdDsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBQb3NpeC1zdHlsZSByZWFkIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNvbnZlcnRlciBpbiBwdWxsIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGEgZmlsZSBvcGVuZWQgZm9yIHJlYWRpbmcuCisgKiBAcGFyYW1bb3V0XSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCBGd2RMb2NrQ29udl9SZWFkRnVuY190KGludCBmaWxlRGVzYywgdm9pZCAqcEJ1ZmZlciwgc2l6ZV90IG51bUJ5dGVzKTsKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBQb3NpeC1zdHlsZSB3cml0ZSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBjb252ZXJ0ZXIgaW4gcHVsbCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhIGZpbGUgb3BlbmVkIGZvciB3cml0aW5nLgorICogQHBhcmFtW2luXSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgorICoKKyAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICogQHJldHZhbCAtMSBGYWlsdXJlLgorICovCit0eXBlZGVmIHNzaXplX3QgRndkTG9ja0NvbnZfV3JpdGVGdW5jX3QoaW50IGZpbGVEZXNjLCBjb25zdCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpOworCisvKioKKyAqIERhdGEgdHlwZSBmb3IgdGhlIFBvc2l4LXN0eWxlIGxzZWVrIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGNvbnZlcnRlciBpbiBwdWxsIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGEgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCisgKiBAcGFyYW1baW5dIG9mZnNldCBUaGUgb2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICogQHBhcmFtW2luXSB3aGVuY2UgT25lIG9mIFNFRUtfU0VULCBTRUVLX0NVUiwgYW5kIFNFRUtfRU5ELgorICoKKyAqIEByZXR1cm4gVGhlIG5ldyBmaWxlIHBvc2l0aW9uLgorICogQHJldHZhbCAoKG9mZjY0X3QpLTEpIEZhaWx1cmUuCisgKi8KK3R5cGVkZWYgb2ZmNjRfdCBGd2RMb2NrQ29udl9MU2Vla0Z1bmNfdChpbnQgZmlsZURlc2MsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBUaGUgc3RhdHVzIGNvZGVzIHJldHVybmVkIGJ5IHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb25zLgorICovCit0eXBlZGVmIGVudW0gRndkTG9ja0NvbnZfU3RhdHVzIHsKKyAgICAvLy8gVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfT0sgPSAwLAorCisgICAgLy8vIEFuIGFjdHVhbCBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gaXMgaW52YWxpZCAoYSBwcm9ncmFtIGVycm9yIG9uIHRoZSBjYWxsZXIncyBwYXJ0KS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50ID0gMSwKKworICAgIC8vLyBUaGVyZSBpcyBub3QgZW5vdWdoIGZyZWUgZHluYW1pYyBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbi4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkgPSAyLAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgdGhlIGlucHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVOb3RGb3VuZCA9IDMsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgdGhlIG91dHB1dCBmaWxlLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlQ3JlYXRpb25GYWlsZWQgPSA0LAorCisgICAgLy8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVJlYWRFcnJvciA9IDUsCisKKyAgICAvLy8gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVXcml0ZUVycm9yID0gNiwKKworICAgIC8vLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZWVraW5nIHRvIGEgbmV3IGZpbGUgcG9zaXRpb24gd2l0aGluIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvciA9IDcsCisKKyAgICAvLy8gVGhlIGlucHV0IGZpbGUgaXMgbm90IGEgc3ludGFjdGljYWxseSBjb3JyZWN0IE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yID0gOCwKKworICAgIC8vLyBTdXBwb3J0IGZvciB0aGlzIERSTSBmaWxlIGZvcm1hdCBoYXMgYmVlbiBkaXNhYmxlZCBpbiB0aGUgY3VycmVudCBwcm9kdWN0IGNvbmZpZ3VyYXRpb24uCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdCA9IDksCisKKyAgICAvLy8gVGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgaXMgbm90IG9uZSBvZiAiYmluYXJ5IiwgImJhc2U2NCIsICI3Yml0Iiwgb3IgIjhiaXQiCisgICAgLy8vIChjYXNlLWluc2Vuc2l0aXZlKS4KKyAgICBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZyA9IDEwLAorCisgICAgLy8vIFRoZSBnZW5lcmF0aW9uIG9mIGEgcmFuZG9tIG51bWJlciBmYWlsZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQgPSAxMSwKKworICAgIC8vLyBLZXkgZW5jcnlwdGlvbiBmYWlsZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQgPSAxMiwKKworICAgIC8vLyBUaGUgY2FsY3VsYXRpb24gb2YgYSBrZXllZCBoYXNoIGZvciBpbnRlZ3JpdHkgcHJvdGVjdGlvbiBmYWlsZWQuCisgICAgRndkTG9ja0NvbnZfU3RhdHVzX0ludGVncml0eVByb3RlY3Rpb25GYWlsZWQgPSAxMywKKworICAgIC8vLyBUaGVyZSBhcmUgdG9vIG1hbnkgb25nb2luZyBzZXNzaW9ucyBmb3IgYW5vdGhlciBvbmUgdG8gYmUgb3BlbmVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMgPSAxNCwKKworICAgIC8vLyBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkLgorICAgIEZ3ZExvY2tDb252X1N0YXR1c19Qcm9ncmFtRXJyb3IgPSAxNQorfSBGd2RMb2NrQ29udl9TdGF0dXNfdDsKKworLyoqCisgKiBPcGVucyBhIHNlc3Npb24gZm9yIGNvbnZlcnRpbmcgYW4gT01BIERSTSB2MSBGb3J3YXJkIExvY2sgZmlsZSB0byB0aGUgaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUKKyAqIGZvcm1hdC4KKyAqCisgKiBAcGFyYW1bb3V0XSBwU2Vzc2lvbklkIFRoZSBzZXNzaW9uIElELgorICogQHBhcmFtW291dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2VzcyAoaW5pdGlhbGl6ZWQpLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucworICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9PcGVuU2Vzc2lvbihpbnQgKnBTZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KTsKKworLyoqCisgKiBTdXBwbGllcyB0aGUgY29udmVydGVyIHdpdGggZGF0YSB0byBjb252ZXJ0LiBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIHdyaXRlIHRoZSBjb252ZXJ0ZWQgZGF0YQorICogdG8gZmlsZS4gQ2FuIGJlIGNhbGxlZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRpbWVzLgorICoKKyAqIEBwYXJhbVtpbl0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIElELgorICogQHBhcmFtW2luXSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gY29udmVydC4KKyAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyB0byBjb252ZXJ0LgorICogQHBhcmFtW2luLG91dF0gcE91dHB1dCBUaGUgb3V0cHV0IGZyb20gdGhlIGNvbnZlcnNpb24gcHJvY2VzcyAoYWxsb2NhdGVkL3JlYWxsb2NhdGVkKS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PSworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfSW52YWxpZEFyZ3VtZW50CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19PdXRPZk1lbW9yeQorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRGF0YUVuY3J5cHRpb25GYWlsZWQKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydERhdGEoaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGd2RMb2NrQ29udl9PdXRwdXRfdCAqcE91dHB1dCk7CisKKy8qKgorICogQ2xvc2VzIGEgc2Vzc2lvbiBmb3IgY29udmVydGluZyBhbiBPTUEgRFJNIHYxIEZvcndhcmQgTG9jayBmaWxlIHRvIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sKKyAqIGZpbGUgZm9ybWF0LiBUaGUgY2FsbGVyIG11c3QgdXBkYXRlIHRoZSBwcm9kdWNlZCBvdXRwdXQgZmlsZSBhdCB0aGUgaW5kaWNhdGVkIGZpbGUgb2Zmc2V0IHdpdGgKKyAqIHRoZSBmaW5hbCBzZXQgb2Ygc2lnbmF0dXJlcy4KKyAqCisgKiBAcGFyYW1baW5dIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBJRC4KKyAqIEBwYXJhbVtpbixvdXRdIHBPdXRwdXQgVGhlIG91dHB1dCBmcm9tIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MgKGRlYWxsb2NhdGVkIGFuZCBvdmVyd3JpdHRlbikuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT0sKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludmFsaWRBcmd1bWVudAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfT3V0T2ZNZW1vcnkKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludGVncml0eVByb3RlY3Rpb25GYWlsZWQKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uKGludCBzZXNzaW9uSWQsIEZ3ZExvY2tDb252X091dHB1dF90ICpwT3V0cHV0KTsKKworLyoqCisgKiBDb252ZXJ0cyBhbiBvcGVuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlIGZvcm1hdCBpbiBwdWxsCisgKiBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0gaW5wdXRGaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvcGVuIGlucHV0IGZpbGUuCisgKiBAcGFyYW1baW5dIGZwUmVhZEZ1bmMgQSByZWZlcmVuY2UgdG8gYSByZWFkIGZ1bmN0aW9uIHRoYXQgY2FuIG9wZXJhdGUgb24gdGhlIG9wZW4gaW5wdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gb3V0cHV0RmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3BlbiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbVtpbl0gZnBXcml0ZUZ1bmMgQSByZWZlcmVuY2UgdG8gYSB3cml0ZSBmdW5jdGlvbiB0aGF0IGNhbiBvcGVyYXRlIG9uIHRoZSBvcGVuIG91dHB1dCBmaWxlLgorICogQHBhcmFtW2luXSBmcExTZWVrRnVuYyBBIHJlZmVyZW5jZSB0byBhbiBsc2VlayBmdW5jdGlvbiB0aGF0IGNhbiBvcGVyYXRlIG9uIHRoZSBvcGVuIG91dHB1dCBmaWxlLgorICogQHBhcmFtW291dF0gcEVycm9yUG9zCisgKiAgIFRoZSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaW4gdGhlIGNhc2Ugb2YgYSBzeW50YXggZXJyb3IuIE1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlUmVhZEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlV3JpdGVFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVNlZWtFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfU3ludGF4RXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkRmlsZUZvcm1hdAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfVW5zdXBwb3J0ZWRDb250ZW50VHJhbnNmZXJFbmNvZGluZworICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfUmFuZG9tTnVtYmVyR2VuZXJhdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfS2V5RW5jcnlwdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRGF0YUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ludGVncml0eVByb3RlY3Rpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Rvb01hbnlTZXNzaW9ucworICovCitGd2RMb2NrQ29udl9TdGF0dXNfdCBGd2RMb2NrQ29udl9Db252ZXJ0T3BlbkZpbGUoaW50IGlucHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfUmVhZEZ1bmNfdCAqZnBSZWFkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0RmlsZURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRndkTG9ja0NvbnZfV3JpdGVGdW5jX3QgKmZwV3JpdGVGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ3ZExvY2tDb252X0xTZWVrRnVuY190ICpmcExTZWVrRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90ICpwRXJyb3JQb3MpOworCisvKioKKyAqIENvbnZlcnRzIGFuIE9NQSBEUk0gdjEgRm9yd2FyZCBMb2NrIGZpbGUgdG8gdGhlIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlIGZvcm1hdCBpbiBwdWxsIG1vZGUuCisgKgorICogQHBhcmFtW2luXSBwSW5wdXRGaWxlbmFtZSBBIHJlZmVyZW5jZSB0byB0aGUgaW5wdXQgZmlsZW5hbWUuCisgKiBAcGFyYW1baW5dIHBPdXRwdXRGaWxlbmFtZSBBIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGZpbGVuYW1lLgorICogQHBhcmFtW291dF0gcEVycm9yUG9zCisgKiAgIFRoZSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZCwgaW4gdGhlIGNhc2Ugb2YgYSBzeW50YXggZXJyb3IuIE1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gQSBzdGF0dXMgY29kZS4KKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX09LCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnZhbGlkQXJndW1lbnQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX091dE9mTWVtb3J5CisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19GaWxlTm90Rm91bmQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVDcmVhdGlvbkZhaWxlZAorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVJlYWRFcnJvcgorICogQHJldHZhbCBGd2RMb2NrQ29udl9TdGF0dXNfRmlsZVdyaXRlRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0ZpbGVTZWVrRXJyb3IKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1N5bnRheEVycm9yCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19VbnN1cHBvcnRlZEZpbGVGb3JtYXQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1Vuc3VwcG9ydGVkQ29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX1JhbmRvbU51bWJlckdlbmVyYXRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0tleUVuY3J5cHRpb25GYWlsZWQKKyAqIEByZXR2YWwgRndkTG9ja0NvbnZfU3RhdHVzX0RhdGFFbmNyeXB0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19JbnRlZ3JpdHlQcm90ZWN0aW9uRmFpbGVkCisgKiBAcmV0dmFsIEZ3ZExvY2tDb252X1N0YXR1c19Ub29NYW55U2Vzc2lvbnMKKyAqLworRndkTG9ja0NvbnZfU3RhdHVzX3QgRndkTG9ja0NvbnZfQ29udmVydEZpbGUoY29uc3QgY2hhciAqcElucHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwT3V0cHV0RmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90ICpwRXJyb3JQb3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLQ09OVl9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI1ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEZ3ZExvY2tGaWxlLmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbW1vbiBcCisgICAgZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3J5cHRvCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZndkbG9jay1jb21tb24KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJmd2Rsb2NrLWNvbW1vbgorCitMT0NBTF9NT0RVTEUgOj0gbGliZndkbG9jay1kZWNvZGVyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuYyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvRndkTG9ja0ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI4NGU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKworI2luY2x1ZGUgIkZ3ZExvY2tGaWxlLmgiCisjaW5jbHVkZSAiRndkTG9ja0dsdWUuaCIKKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIElOVkFMSURfT0ZGU0VUICgob2ZmNjRfdCktMSkKKworI2RlZmluZSBJTlZBTElEX0JMT0NLX0lOREVYICgodWludDY0X3QpLTEpCisKKyNkZWZpbmUgTUFYX05VTV9TRVNTSU9OUyAxMjgKKworI2RlZmluZSBLRVlfU0laRSBBRVNfQkxPQ0tfU0laRQorI2RlZmluZSBLRVlfU0laRV9JTl9CSVRTIChLRVlfU0laRSAqIDgpCisKKyNkZWZpbmUgU0hBMV9IQVNIX1NJWkUgMjAKKyNkZWZpbmUgU0hBMV9CTE9DS19TSVpFIDY0CisKKyNkZWZpbmUgRldEX0xPQ0tfVkVSU0lPTiAwCisjZGVmaW5lIEZXRF9MT0NLX1NVQkZPUk1BVCAwCisjZGVmaW5lIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIDAKKyNkZWZpbmUgQ09OVEVOVF9UWVBFX0xFTkdUSF9QT1MgNworI2RlZmluZSBUT1BfSEVBREVSX1NJWkUgOAorCisjZGVmaW5lIFNJR19DQUxDX0JVRkZFUl9TSVpFICgxNiAqIFNIQTFfQkxPQ0tfU0laRSkKKworLyoqCisgKiBEYXRhIHR5cGUgZm9yIHRoZSBwZXItZmlsZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGRlY29kZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZ3ZExvY2tGaWxlX1Nlc3Npb24geworICAgIGludCBmaWxlRGVzYzsKKyAgICB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlcltUT1BfSEVBREVSX1NJWkVdOworICAgIGNoYXIgKnBDb250ZW50VHlwZTsKKyAgICBzaXplX3QgY29udGVudFR5cGVMZW5ndGg7CisgICAgdm9pZCAqcEVuY3J5cHRlZFNlc3Npb25LZXk7CisgICAgc2l6ZV90IGVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBkYXRhU2lnbmF0dXJlW1NIQTFfSEFTSF9TSVpFXTsKKyAgICB1bnNpZ25lZCBjaGFyIGhlYWRlclNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgb2ZmNjRfdCBkYXRhT2Zmc2V0OworICAgIG9mZjY0X3QgZmlsZVBvczsKKyAgICBBRVNfS0VZIGVuY3J5cHRpb25Sb3VuZEtleXM7CisgICAgSE1BQ19DVFggc2lnbmluZ0NvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciBrZXlTdHJlYW1bQUVTX0JMT0NLX1NJWkVdOworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXg7Cit9IEZ3ZExvY2tGaWxlX1Nlc3Npb25fdDsKKworc3RhdGljIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqc2Vzc2lvblB0cnNbTUFYX05VTV9TRVNTSU9OU10gPSB7IE5VTEwgfTsKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzZXNzaW9uQWNxdWlzaXRpb25NdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvcEhlYWRlclRlbXBsYXRlW10gPQorICAgIHsgJ0YnLCAnVycsICdMJywgJ0snLCBGV0RfTE9DS19WRVJTSU9OLCBGV0RfTE9DS19TVUJGT1JNQVQsIFVTQUdFX1JFU1RSSUNUSU9OX0ZMQUdTIH07CisKKy8qKgorICogQWNxdWlyZXMgYW4gdW51c2VkIGZpbGUgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIEEgZmlsZSBkZXNjcmlwdG9yLgorICoKKyAqIEByZXR1cm4gQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgaW50IEZ3ZExvY2tGaWxlX0FjcXVpcmVTZXNzaW9uKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSAtMTsKKyAgICBpZiAoZmlsZURlc2MgPCAwKSB7CisgICAgICAgIGVycm5vID0gRUJBREY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9TRVNTSU9OUzsgKytpKSB7CisgICAgICAgICAgICBpbnQgY2FuZGlkYXRlU2Vzc2lvbklkID0gKGZpbGVEZXNjICsgaSkgJSBNQVhfTlVNX1NFU1NJT05TOworICAgICAgICAgICAgaWYgKHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNlc3Npb25QdHJzW2NhbmRpZGF0ZVNlc3Npb25JZF0gPSBtYWxsb2Moc2l6ZW9mICoqc2Vzc2lvblB0cnMpOworICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+ZmlsZURlc2MgPSBmaWxlRGVzYzsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblB0cnNbY2FuZGlkYXRlU2Vzc2lvbklkXS0+cEVuY3J5cHRlZFNlc3Npb25LZXkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjYW5kaWRhdGVTZXNzaW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgICAgIGlmIChpID09IE1BWF9OVU1fU0VTU0lPTlMpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5GSUxFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogRmluZHMgdGhlIGZpbGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBBIGZpbGUgZGVzY3JpcHRvci4KKyAqCisgKiBAcmV0dXJuIEEgc2Vzc2lvbiBJRC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gLTE7CisgICAgaWYgKGZpbGVEZXNjIDwgMCkgeworICAgICAgICBlcnJubyA9IEVCQURGOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fU0VTU0lPTlM7ICsraSkgeworICAgICAgICAgICAgaW50IGNhbmRpZGF0ZVNlc3Npb25JZCA9IChmaWxlRGVzYyArIGkpICUgTUFYX05VTV9TRVNTSU9OUzsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBzZXNzaW9uUHRyc1tjYW5kaWRhdGVTZXNzaW9uSWRdLT5maWxlRGVzYyA9PSBmaWxlRGVzYykgeworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbmRpZGF0ZVNlc3Npb25JZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2Vzc2lvbkFjcXVpc2l0aW9uTXV0ZXgpOworICAgICAgICBpZiAoaSA9PSBNQVhfTlVNX1NFU1NJT05TKSB7CisgICAgICAgICAgICBlcnJubyA9IEVCQURGOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWQ7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBmaWxlIHNlc3Npb24uCisgKgorICogQHBhcmFtW2luXSBzZXNzaW9uSUQgQSBzZXNzaW9uIElELgorICovCitzdGF0aWMgdm9pZCBGd2RMb2NrRmlsZV9SZWxlYXNlU2Vzc2lvbihpbnQgc2Vzc2lvbklkKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZXNzaW9uQWNxdWlzaXRpb25NdXRleCk7CisgICAgYXNzZXJ0KDAgPD0gc2Vzc2lvbklkICYmIHNlc3Npb25JZCA8IE1BWF9OVU1fU0VTU0lPTlMgJiYgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSAhPSBOVUxMKTsKKyAgICBmcmVlKHNlc3Npb25QdHJzW3Nlc3Npb25JZF0tPnBDb250ZW50VHlwZSk7CisgICAgZnJlZShzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5wRW5jcnlwdGVkU2Vzc2lvbktleSk7CisgICAgbWVtc2V0KHNlc3Npb25QdHJzW3Nlc3Npb25JZF0sIDAsIHNpemVvZiAqc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7IC8vIFplcm8gb3V0IGtleSBkYXRhLgorICAgIGZyZWUoc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSk7CisgICAgc2Vzc2lvblB0cnNbc2Vzc2lvbklkXSA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlc3Npb25BY3F1aXNpdGlvbk11dGV4KTsKK30KKworLyoqCisgKiBEZXJpdmVzIGtleXMgZm9yIGVuY3J5cHRpb24gYW5kIHNpZ25pbmcgZnJvbSB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5LgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBrZXkgZGVyaXZhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworc3RhdGljIGludCBGd2RMb2NrRmlsZV9EZXJpdmVLZXlzKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfRGVyaXZlS2V5c19EYXRhIHsKKyAgICAgICAgQUVTX0tFWSBzZXNzaW9uUm91bmRLZXlzOworICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlW0tFWV9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrZXlbS0VZX1NJWkVdOworICAgIH0gKnBEYXRhID0gbWFsbG9jKHNpemVvZiAqcERhdGEpOworICAgIGlmIChwRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IEZ3ZExvY2tHbHVlX0RlY3J5cHRLZXkocFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoLCBwRGF0YS0+a2V5LCBLRVlfU0laRSk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KHBEYXRhLT5rZXksIEtFWV9TSVpFX0lOX0JJVFMsICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cykgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNyeXB0IHRoZSAxNi1ieXRlIHZhbHVlIHswLCAwLCAuLi4sIDB9IHRvIHByb2R1Y2UgdGhlIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgICAgICAgIG1lbXNldChwRGF0YS0+dmFsdWUsIDAsIEtFWV9TSVpFKTsKKyAgICAgICAgICAgICAgICBBRVNfZW5jcnlwdChwRGF0YS0+dmFsdWUsIHBEYXRhLT5rZXksICZwRGF0YS0+c2Vzc2lvblJvdW5kS2V5cyk7CisgICAgICAgICAgICAgICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkocERhdGEtPmtleSwgS0VZX1NJWkVfSU5fQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRW5jcnlwdCB0aGUgMTYtYnl0ZSB2YWx1ZSB7MSwgMCwgLi4uLCAwfSB0byBwcm9kdWNlIHRoZSBzaWduaW5nIGtleS4KKyAgICAgICAgICAgICAgICAgICAgKytwRGF0YS0+dmFsdWVbMF07CisgICAgICAgICAgICAgICAgICAgIEFFU19lbmNyeXB0KHBEYXRhLT52YWx1ZSwgcERhdGEtPmtleSwgJnBEYXRhLT5zZXNzaW9uUm91bmRLZXlzKTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19DVFhfaW5pdCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19Jbml0X2V4KCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5rZXksIEtFWV9TSVpFLCBFVlBfc2hhMSgpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5PU1lTOworICAgICAgICB9CisgICAgICAgIG1lbXNldChwRGF0YSwgMCwgc2l6ZW9mIHBEYXRhKTsgLy8gWmVybyBvdXQga2V5IGRhdGEuCisgICAgICAgIGZyZWUocERhdGEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENhbGN1bGF0ZXMgdGhlIGNvdW50ZXIsIHRyZWF0ZWQgYXMgYSAxNi1ieXRlIGxpdHRsZS1lbmRpYW4gbnVtYmVyLCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBrZXlzdHJlYW0KKyAqIGZvciB0aGUgZ2l2ZW4gYmxvY2suCisgKgorICogQHBhcmFtW2luXSBwTm9uY2UgQSByZWZlcmVuY2UgdG8gdGhlIG5vbmNlLgorICogQHBhcmFtW2luXSBibG9ja0luZGV4IFRoZSBpbmRleCBudW1iZXIgb2YgdGhlIGJsb2NrLgorICogQHBhcmFtW291dF0gcENvdW50ZXIgQSByZWZlcmVuY2UgdG8gdGhlIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIEZ3ZExvY2tGaWxlX0NhbGN1bGF0ZUNvdW50ZXIoY29uc3QgdW5zaWduZWQgY2hhciAqcE5vbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBibG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwQ291bnRlcikgeworICAgIHVuc2lnbmVkIGNoYXIgY2FycnkgPSAwOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IHNpemVvZiBibG9ja0luZGV4OyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwYXJ0ID0gcE5vbmNlW2ldICsgKHVuc2lnbmVkIGNoYXIpKGJsb2NrSW5kZXggPj4gKGkgKiBDSEFSX0JJVCkpOworICAgICAgICBwQ291bnRlcltpXSA9IHBhcnQgKyBjYXJyeTsKKyAgICAgICAgY2FycnkgPSAocGFydCA8IHBOb25jZVtpXSB8fCBwQ291bnRlcltpXSA8IHBhcnQpID8gMSA6IDA7CisgICAgfQorICAgIGZvciAoOyBpIDwgQUVTX0JMT0NLX1NJWkU7ICsraSkgeworICAgICAgICBwQ291bnRlcltpXSA9IHBOb25jZVtpXSArIGNhcnJ5OworICAgICAgICBjYXJyeSA9IChwQ291bnRlcltpXSA8IHBOb25jZVtpXSkgPyAxIDogMDsKKyAgICB9Cit9CisKKy8qKgorICogRGVjcnlwdHMgdGhlIGJ5dGUgYXQgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiB1c2luZyBBRVMtMTI4LUNUUi4gSW4gQ1RSIChvciAiY291bnRlciIpIG1vZGUsCisgKiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlIHNhbWUgYWxnb3JpdGhtLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHBTZXNzaW9uIEEgcmVmZXJlbmNlIHRvIGEgZmlsZSBzZXNzaW9uLgorICogQHBhcmFtW2luXSBwQnl0ZSBUaGUgYnl0ZSB0byBkZWNyeXB0LgorICovCit2b2lkIEZ3ZExvY2tGaWxlX0RlY3J5cHRCeXRlKEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqIHBTZXNzaW9uLCB1bnNpZ25lZCBjaGFyICpwQnl0ZSkgeworICAgIHVpbnQ2NF90IGJsb2NrSW5kZXggPSBwU2Vzc2lvbi0+ZmlsZVBvcyAvIEFFU19CTE9DS19TSVpFOworICAgIHVpbnQ2NF90IGJsb2NrT2Zmc2V0ID0gcFNlc3Npb24tPmZpbGVQb3MgJSBBRVNfQkxPQ0tfU0laRTsKKyAgICBpZiAoYmxvY2tJbmRleCAhPSBwU2Vzc2lvbi0+YmxvY2tJbmRleCkgeworICAgICAgICAvLyBUaGUgZmlyc3QgMTYgYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyB1c2VkIGFzIHRoZSBub25jZS4KKyAgICAgICAgdW5zaWduZWQgY2hhciBjb3VudGVyW0FFU19CTE9DS19TSVpFXTsKKyAgICAgICAgRndkTG9ja0ZpbGVfQ2FsY3VsYXRlQ291bnRlcihwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksIGJsb2NrSW5kZXgsIGNvdW50ZXIpOworICAgICAgICBBRVNfZW5jcnlwdChjb3VudGVyLCBwU2Vzc2lvbi0+a2V5U3RyZWFtLCAmcFNlc3Npb24tPmVuY3J5cHRpb25Sb3VuZEtleXMpOworICAgICAgICBwU2Vzc2lvbi0+YmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7CisgICAgfQorICAgICpwQnl0ZSBePSBwU2Vzc2lvbi0+a2V5U3RyZWFtW2Jsb2NrT2Zmc2V0XTsKK30KKworaW50IEZ3ZExvY2tGaWxlX2F0dGFjaChpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfQWNxdWlyZVNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPj0gMCkgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgaW50IGlzU3VjY2VzcyA9IEZBTFNFOworICAgICAgICBpZiAocmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnRvcEhlYWRlciwgVE9QX0hFQURFUl9TSVpFKSA9PSBUT1BfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAocFNlc3Npb24tPnRvcEhlYWRlciwgdG9wSGVhZGVyVGVtcGxhdGUsIHNpemVvZiB0b3BIZWFkZXJUZW1wbGF0ZSkgPT0gMCkgeworICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoID0gcFNlc3Npb24tPnRvcEhlYWRlcltDT05URU5UX1RZUEVfTEVOR1RIX1BPU107CisgICAgICAgICAgICBhc3NlcnQocFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoIDw9IFVDSEFSX01BWCk7IC8vIFVudGFpbnQgc2NhbGFyIGZvciBjb2RlIGNoZWNrZXJzLgorICAgICAgICAgICAgcFNlc3Npb24tPnBDb250ZW50VHlwZSA9IG1hbGxvYyhwU2Vzc2lvbi0+Y29udGVudFR5cGVMZW5ndGggKyAxKTsKKyAgICAgICAgICAgIGlmIChwU2Vzc2lvbi0+cENvbnRlbnRUeXBlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPnBDb250ZW50VHlwZSwgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCkgeworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wQ29udGVudFR5cGVbcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmVuY3J5cHRlZFNlc3Npb25LZXlMZW5ndGggPSBGd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGgoS0VZX1NJWkUpOworICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSA9IG1hbGxvYyhwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHBTZXNzaW9uLT5wRW5jcnlwdGVkU2Vzc2lvbktleSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKGZpbGVEZXNjLCBwU2Vzc2lvbi0+cEVuY3J5cHRlZFNlc3Npb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3NpemVfdClwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIFNIQTFfSEFTSF9TSVpFKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEExX0hBU0hfU0laRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZChmaWxlRGVzYywgcFNlc3Npb24tPmhlYWRlclNpZ25hdHVyZSwgU0hBMV9IQVNIX1NJWkUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQTFfSEFTSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGlzU3VjY2VzcyA9IEZ3ZExvY2tGaWxlX0Rlcml2ZUtleXMocFNlc3Npb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTdWNjZXNzKSB7CisgICAgICAgICAgICBwU2Vzc2lvbi0+ZGF0YU9mZnNldCA9IHBTZXNzaW9uLT5jb250ZW50VHlwZUxlbmd0aCArCisgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5lbmNyeXB0ZWRTZXNzaW9uS2V5TGVuZ3RoICsgVE9QX0hFQURFUl9TSVpFICsgMiAqIFNIQTFfSEFTSF9TSVpFOworICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSAwOworICAgICAgICAgICAgcFNlc3Npb24tPmJsb2NrSW5kZXggPSBJTlZBTElEX0JMT0NLX0lOREVYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHNlc3Npb25JZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoc2Vzc2lvbklkID49IDApID8gMCA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfb3Blbihjb25zdCBjaGFyICpwRmlsZW5hbWUpIHsKKyAgICBpbnQgZmlsZURlc2MgPSBvcGVuKHBGaWxlbmFtZSwgT19SRE9OTFkpOworICAgIGlmIChmaWxlRGVzYyA+PSAwICYmIEZ3ZExvY2tGaWxlX2F0dGFjaChmaWxlRGVzYykgPCAwKSB7CisgICAgICAgICh2b2lkKWNsb3NlKGZpbGVEZXNjKTsKKyAgICAgICAgZmlsZURlc2MgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZpbGVEZXNjOworfQorCitzc2l6ZV90IEZ3ZExvY2tGaWxlX3JlYWQoaW50IGZpbGVEZXNjLCB2b2lkICpwQnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpIHsKKyAgICBzc2l6ZV90IG51bUJ5dGVzUmVhZDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICBzc2l6ZV90IGk7CisgICAgICAgIG51bUJ5dGVzUmVhZCA9IHJlYWQocFNlc3Npb24tPmZpbGVEZXNjLCBwQnVmZmVyLCBudW1CeXRlcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1CeXRlc1JlYWQ7ICsraSkgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfRGVjcnlwdEJ5dGUocFNlc3Npb24sICYoKHVuc2lnbmVkIGNoYXIgKilwQnVmZmVyKVtpXSk7CisgICAgICAgICAgICArK3BTZXNzaW9uLT5maWxlUG9zOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1CeXRlc1JlYWQ7Cit9CisKK29mZjY0X3QgRndkTG9ja0ZpbGVfbHNlZWsoaW50IGZpbGVEZXNjLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgeworICAgIG9mZjY0X3QgbmV3RmlsZVBvczsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICB9IGVsc2UgeworICAgICAgICBGd2RMb2NrRmlsZV9TZXNzaW9uX3QgKnBTZXNzaW9uID0gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXTsKKyAgICAgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICAgICAgY2FzZSBTRUVLX1NFVDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgcFNlc3Npb24tPmRhdGFPZmZzZXQgKyBvZmZzZXQsIHdoZW5jZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBsc2VlazY0KHBTZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIG5ld0ZpbGVQb3MgPSBJTlZBTElEX09GRlNFVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdGaWxlUG9zICE9IElOVkFMSURfT0ZGU0VUKSB7CisgICAgICAgICAgICBpZiAobmV3RmlsZVBvcyA8IHBTZXNzaW9uLT5kYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWxlIHBvc2l0aW9uIGlzIGlsbGVnYWwgZm9yIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLiBSZXN0b3JlIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGZpbGUgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IElOVkFMSURfT0ZGU0VUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB0aGUgZmlsZSBwb3NpdGlvbiB0aGF0IGxzZWVrNjQoKSB3b3VsZCBoYXZlIHJldHVybmVkCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBlbWJlZGRlZCBjb250ZW50IGZpbGUuCisgICAgICAgICAgICAgICAgcFNlc3Npb24tPmZpbGVQb3MgPSBuZXdGaWxlUG9zIC0gcFNlc3Npb24tPmRhdGFPZmZzZXQ7CisgICAgICAgICAgICAgICAgbmV3RmlsZVBvcyA9IHBTZXNzaW9uLT5maWxlUG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdGaWxlUG9zOworfQorCitpbnQgRndkTG9ja0ZpbGVfZGV0YWNoKGludCBmaWxlRGVzYykgeworICAgIGludCBzZXNzaW9uSWQgPSBGd2RMb2NrRmlsZV9GaW5kU2Vzc2lvbihmaWxlRGVzYyk7CisgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBITUFDX0NUWF9jbGVhbnVwKCZzZXNzaW9uUHRyc1tzZXNzaW9uSWRdLT5zaWduaW5nQ29udGV4dCk7CisgICAgRndkTG9ja0ZpbGVfUmVsZWFzZVNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYykgeworICAgIHJldHVybiAoRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKSA9PSAwKSA/IGNsb3NlKGZpbGVEZXNjKSA6IC0xOworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYykgeworICAgIGludCByZXN1bHQ7CisgICAgaW50IHNlc3Npb25JZCA9IEZ3ZExvY2tGaWxlX0ZpbmRTZXNzaW9uKGZpbGVEZXNjKTsKKyAgICBpZiAoc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5X0RhdGEgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzaWduYXR1cmVbU0hBMV9IQVNIX1NJWkVdOworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbU0lHX0NBTENfQlVGRkVSX1NJWkVdOworICAgICAgICB9ICpwRGF0YSA9IG1hbGxvYyhzaXplb2YgKnBEYXRhKTsKKyAgICAgICAgaWYgKHBEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRndkTG9ja0ZpbGVfU2Vzc2lvbl90ICpwU2Vzc2lvbiA9IHNlc3Npb25QdHJzW3Nlc3Npb25JZF07CisgICAgICAgICAgICBpZiAobHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0KKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmRhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQ7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ25hdHVyZVNpemUgPSBTSEExX0hBU0hfU0laRTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkKHBTZXNzaW9uLT5maWxlRGVzYywgcERhdGEtPmJ1ZmZlciwgU0lHX0NBTENfQlVGRkVSX1NJWkUpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcERhdGEtPmJ1ZmZlciwgKHNpemVfdCludW1CeXRlc1JlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtQnl0ZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBITUFDX0ZpbmFsKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBEYXRhLT5zaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZW1jbXAocERhdGEtPnNpZ25hdHVyZSwgcFNlc3Npb24tPmRhdGFTaWduYXR1cmUsIHNpZ25hdHVyZVNpemUpID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEhNQUNfSW5pdF9leCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBOVUxMLCBLRVlfU0laRSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbHNlZWs2NChwU2Vzc2lvbi0+ZmlsZURlc2MsIHBTZXNzaW9uLT5kYXRhT2Zmc2V0ICsgcFNlc3Npb24tPmZpbGVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUVLX1NFVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIEZ3ZExvY2tGaWxlX1Nlc3Npb25fdCAqcFNlc3Npb24gPSBzZXNzaW9uUHRyc1tzZXNzaW9uSWRdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTSEExX0hBU0hfU0laRV07CisgICAgICAgIHNpemVfdCBzaWduYXR1cmVTaXplID0gU0hBMV9IQVNIX1NJWkU7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT50b3BIZWFkZXIsIFRPUF9IRUFERVJfU0laRSk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsICh1bnNpZ25lZCBjaGFyICopcFNlc3Npb24tPnBDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPmNvbnRlbnRUeXBlTGVuZ3RoKTsKKyAgICAgICAgSE1BQ19VcGRhdGUoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgcFNlc3Npb24tPnBFbmNyeXB0ZWRTZXNzaW9uS2V5LAorICAgICAgICAgICAgICAgICAgICBwU2Vzc2lvbi0+ZW5jcnlwdGVkU2Vzc2lvbktleUxlbmd0aCk7CisgICAgICAgIEhNQUNfVXBkYXRlKCZwU2Vzc2lvbi0+c2lnbmluZ0NvbnRleHQsIHBTZXNzaW9uLT5kYXRhU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKTsKKyAgICAgICAgSE1BQ19GaW5hbCgmcFNlc3Npb24tPnNpZ25pbmdDb250ZXh0LCBzaWduYXR1cmUsICZzaWduYXR1cmVTaXplKTsKKyAgICAgICAgYXNzZXJ0KHNpZ25hdHVyZVNpemUgPT0gU0hBMV9IQVNIX1NJWkUpOworICAgICAgICByZXN1bHQgPSBtZW1jbXAoc2lnbmF0dXJlLCBwU2Vzc2lvbi0+aGVhZGVyU2lnbmF0dXJlLCBzaWduYXR1cmVTaXplKSA9PSAwOworICAgICAgICBITUFDX0luaXRfZXgoJnBTZXNzaW9uLT5zaWduaW5nQ29udGV4dCwgTlVMTCwgS0VZX1NJWkUsIE5VTEwsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHkoaW50IGZpbGVEZXNjKSB7CisgICAgcmV0dXJuIEZ3ZExvY2tGaWxlX0NoZWNrSGVhZGVySW50ZWdyaXR5KGZpbGVEZXNjKSAmJiBGd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHkoZmlsZURlc2MpOworfQorCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpIHsKKyAgICBpbnQgc2Vzc2lvbklkID0gRndkTG9ja0ZpbGVfRmluZFNlc3Npb24oZmlsZURlc2MpOworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvblB0cnNbc2Vzc2lvbklkXS0+cENvbnRlbnRUeXBlOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9Gd2RMb2NrRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjQwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0Z3ZExvY2tGaWxlLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRldETE9DS0ZJTEVfSF9fCisjZGVmaW5lIF9fRldETE9DS0ZJTEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIEF0dGFjaGVzIHRvIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuIFRoZSBmaWxlIHBvc2l0aW9uIGlzIGFzc3VtZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAqIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9hdHRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBPcGVucyBhIEZvcndhcmQgTG9jayBmaWxlIGZvciByZWFkaW5nLgorICoKKyAqIEBwYXJhbVtpbl0gcEZpbGVuYW1lIEEgcmVmZXJlbmNlIHRvIGEgZmlsZW5hbWUuCisgKgorICogQHJldHVybiBBIGZpbGUgZGVzY3JpcHRvci4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX29wZW4oY29uc3QgY2hhciAqcEZpbGVuYW1lKTsKKworLyoqCisgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKiBAcGFyYW1bb3V0XSBwQnVmZmVyIEEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICogQHBhcmFtW2luXSBudW1CeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKgorICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK3NzaXplX3QgRndkTG9ja0ZpbGVfcmVhZChpbnQgZmlsZURlc2MsIHZvaWQgKnBCdWZmZXIsIHNpemVfdCBudW1CeXRlcyk7CisKKy8qKgorICogVXBkYXRlcyB0aGUgZmlsZSBwb3NpdGlvbiB3aXRoaW4gYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqIEBwYXJhbVtpbl0gb2Zmc2V0IFRoZSBvZmZzZXQgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIGZpbGUgcG9zaXRpb24uCisgKiBAcGFyYW1baW5dIHdoZW5jZSBPbmUgb2YgU0VFS19TRVQsIFNFRUtfQ1VSLCBhbmQgU0VFS19FTkQuCisgKgorICogQHJldHVybiBUaGUgbmV3IGZpbGUgcG9zaXRpb24uCisgKiBAcmV0dmFsICgob2ZmNjRfdCktMSkgRmFpbHVyZS4KKyAqLworb2ZmNjRfdCBGd2RMb2NrRmlsZV9sc2VlayhpbnQgZmlsZURlc2MsIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKKworLyoqCisgKiBEZXRhY2hlcyBmcm9tIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIHN0YXR1cyBjb2RlLgorICogQHJldHZhbCAwIFN1Y2Nlc3MuCisgKiBAcmV0dmFsIC0xIEZhaWx1cmUuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9kZXRhY2goaW50IGZpbGVEZXNjKTsKKworLyoqCisgKiBDbG9zZXMgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcGFyYW1baW5dIGZpbGVEZXNjIFRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gb3BlbiBGb3J3YXJkIExvY2sgZmlsZS4KKyAqCisgKiBAcmV0dXJuIEEgc3RhdHVzIGNvZGUuCisgKiBAcmV0dmFsIDAgU3VjY2Vzcy4KKyAqIEByZXR2YWwgLTEgRmFpbHVyZS4KKyAqLworaW50IEZ3ZExvY2tGaWxlX2Nsb3NlKGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBkYXRhIGludGVncml0eSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4gQSBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW50ZWdyaXR5IGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICovCitpbnQgRndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5KGludCBmaWxlRGVzYyk7CisKKy8qKgorICogQ2hlY2tzIHRoZSBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0hlYWRlckludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIENoZWNrcyBib3RoIHRoZSBkYXRhIGFuZCBoZWFkZXIgaW50ZWdyaXR5IG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHBhcmFtW2luXSBmaWxlRGVzYyBUaGUgZmlsZSBkZXNjcmlwdG9yIG9mIGFuIG9wZW4gRm9yd2FyZCBMb2NrIGZpbGUuCisgKgorICogQHJldHVybiBBIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbnRlZ3JpdHkgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgKi8KK2ludCBGd2RMb2NrRmlsZV9DaGVja0ludGVncml0eShpbnQgZmlsZURlc2MpOworCisvKioKKyAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEBwYXJhbVtpbl0gZmlsZURlc2MgVGhlIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBvcGVuIEZvcndhcmQgTG9jayBmaWxlLgorICoKKyAqIEByZXR1cm4KKyAqICAgQSByZWZlcmVuY2UgdG8gdGhlIGNvbnRlbnQgdHlwZS4gVGhlIHJlZmVyZW5jZSByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIGZpbGUgaXMga2VwdCBvcGVuLgorICovCitjb25zdCBjaGFyICpGd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZShpbnQgZmlsZURlc2MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX19GV0RMT0NLRklMRV9IX18KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhmOTVjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCkBAIC0wLDAgKzEsMTAzOSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Cis8bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCAxMiAoZmlsdGVyZWQpIj4KKzx0aXRsZT5Gb3J3YXJkIExvY2sgQ29udmVydGVyIGFuZCBEZWNvZGVyPC90aXRsZT4KKzxzdHlsZT4KKzwhLS0KKyAvKiBGb250IERlZmluaXRpb25zICovCisgQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpTaW1TdW47CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOworCXBhbm9zZS0xOjIgNCA1IDMgNSA0IDYgMyAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseTpUYWhvbWE7CisJcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7fQorQGZvbnQtZmFjZQorCXtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIjsKKwlwYW5vc2UtMToyIDExIDYgOSA0IDUgNCAyIDIgNDt9CitAZm9udC1mYWNlCisJe2ZvbnQtZmFtaWx5OiJcQFNpbVN1biI7CisJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9CisgLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KKyBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCisJe21hcmdpbjowY207CisJbWFyZ2luLWJvdHRvbTouMDAwMXB0OworCWZvbnQtc2l6ZToxMi4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitoMQorCXttYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1sZWZ0OjIxLjZwdDsKKwl0ZXh0LWluZGVudDotMjEuNnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE2LjBwdDsKKwlmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIjt9CitoMgorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6MjguOHB0OworCXRleHQtaW5kZW50Oi0yOC44cHQ7CisJcGFnZS1icmVhay1hZnRlcjphdm9pZDsKKwlmb250LXNpemU6MTQuMHB0OworCWZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK2gzCisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDozNi4wcHQ7CisJdGV4dC1pbmRlbnQ6LTM2LjBwdDsKKwlwYWdlLWJyZWFrLWFmdGVyOmF2b2lkOworCWZvbnQtc2l6ZToxMy4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQoraDQKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjQzLjJwdDsKKwl0ZXh0LWluZGVudDotNDMuMnB0OworCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7CisJZm9udC1zaXplOjE0LjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiO30KK2g1CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo1MC40cHQ7CisJdGV4dC1pbmRlbnQ6LTUwLjRwdDsKKwlmb250LXNpemU6MTMuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQoraDYKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0OjU3LjZwdDsKKwl0ZXh0LWluZGVudDotNTcuNnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjt9CitwLk1zb0hlYWRpbmc3LCBsaS5Nc29IZWFkaW5nNywgZGl2Lk1zb0hlYWRpbmc3CisJe21hcmdpbi10b3A6MTIuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTozLjBwdDsKKwltYXJnaW4tbGVmdDo2NC44cHQ7CisJdGV4dC1pbmRlbnQ6LTY0LjhwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkaW5nOCwgbGkuTXNvSGVhZGluZzgsIGRpdi5Nc29IZWFkaW5nOAorCXttYXJnaW4tdG9wOjEyLjBwdDsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206My4wcHQ7CisJbWFyZ2luLWxlZnQ6NzIuMHB0OworCXRleHQtaW5kZW50Oi03Mi4wcHQ7CisJZm9udC1zaXplOjEyLjBwdDsKKwlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOworCWZvbnQtc3R5bGU6aXRhbGljO30KK3AuTXNvSGVhZGluZzksIGxpLk1zb0hlYWRpbmc5LCBkaXYuTXNvSGVhZGluZzkKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjMuMHB0OworCW1hcmdpbi1sZWZ0Ojc5LjJwdDsKKwl0ZXh0LWluZGVudDotNzkuMnB0OworCWZvbnQtc2l6ZToxMS4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7fQorcC5Nc29Ub2MxLCBsaS5Nc29Ub2MxLCBkaXYuTXNvVG9jMQorCXttYXJnaW4tdG9wOjYuMHB0OworCW1hcmdpbi1yaWdodDowY207CisJbWFyZ2luLWJvdHRvbTo2LjBwdDsKKwltYXJnaW4tbGVmdDowY207CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOworCWZvbnQtd2VpZ2h0OmJvbGQ7fQorcC5Nc29Ub2MyLCBsaS5Nc29Ub2MyLCBkaXYuTXNvVG9jMgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjEyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC12YXJpYW50OnNtYWxsLWNhcHM7fQorcC5Nc29Ub2MzLCBsaS5Nc29Ub2MzLCBkaXYuTXNvVG9jMworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjI0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJbGluZS1oZWlnaHQ6MTUwJTsKKwlmb250LXNpemU6MTAuNXB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC1zdHlsZTppdGFsaWM7fQorcC5Nc29Ub2M0LCBsaS5Nc29Ub2M0LCBkaXYuTXNvVG9jNAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjM2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M1LCBsaS5Nc29Ub2M1LCBkaXYuTXNvVG9jNQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjQ4LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M2LCBsaS5Nc29Ub2M2LCBkaXYuTXNvVG9jNgorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjYwLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M3LCBsaS5Nc29Ub2M3LCBkaXYuTXNvVG9jNworCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0OjcyLjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M4LCBsaS5Nc29Ub2M4LCBkaXYuTXNvVG9jOAorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojg0LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Ub2M5LCBsaS5Nc29Ub2M5LCBkaXYuTXNvVG9jOQorCXttYXJnaW4tdG9wOjBjbTsKKwltYXJnaW4tcmlnaHQ6MGNtOworCW1hcmdpbi1ib3R0b206MGNtOworCW1hcmdpbi1sZWZ0Ojk2LjBwdDsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjkuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290bm90ZVRleHQsIGxpLk1zb0Zvb3Rub3RlVGV4dCwgZGl2Lk1zb0Zvb3Rub3RlVGV4dAorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTAuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29IZWFkZXIsIGxpLk1zb0hlYWRlciwgZGl2Lk1zb0hlYWRlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29Gb290ZXIsIGxpLk1zb0Zvb3RlciwgZGl2Lk1zb0Zvb3RlcgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorcC5Nc29DYXB0aW9uLCBsaS5Nc29DYXB0aW9uLCBkaXYuTXNvQ2FwdGlvbgorCXttYXJnaW46MGNtOworCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKKwlmb250LXNpemU6MTEuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitzcGFuLk1zb0Zvb3Rub3RlUmVmZXJlbmNlCisJe3ZlcnRpY2FsLWFsaWduOnN1cGVyO30KK3AuTXNvVGl0bGUsIGxpLk1zb1RpdGxlLCBkaXYuTXNvVGl0bGUKKwl7bWFyZ2luLXRvcDoxMi4wcHQ7CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjEyMC4wcHQ7CisJbWFyZ2luLWxlZnQ6MGNtOworCXRleHQtYWxpZ246Y2VudGVyOworCWZvbnQtc2l6ZToxNi4wcHQ7CisJZm9udC1mYW1pbHk6IkFyaWFsIiwic2Fucy1zZXJpZiI7CisJZm9udC13ZWlnaHQ6Ym9sZDt9CitwLk1zb0JvZHlUZXh0LCBsaS5Nc29Cb2R5VGV4dCwgZGl2Lk1zb0JvZHlUZXh0CisJe21zby1zdHlsZS1saW5rOiJCb2R5IFRleHQgQ2hhciI7CisJbWFyZ2luLXRvcDowY207CisJbWFyZ2luLXJpZ2h0OjBjbTsKKwltYXJnaW4tYm90dG9tOjYuMHB0OworCW1hcmdpbi1sZWZ0OjBjbTsKKwlmb250LXNpemU6MTIuMHB0OworCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7fQorYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaworCXtjb2xvcjpibHVlOworCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQorYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkCisJe2NvbG9yOnB1cnBsZTsKKwl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KK3AuTXNvQWNldGF0ZSwgbGkuTXNvQWNldGF0ZSwgZGl2Lk1zb0FjZXRhdGUKKwl7bWFyZ2luOjBjbTsKKwltYXJnaW4tYm90dG9tOi4wMDAxcHQ7CisJZm9udC1zaXplOjguMHB0OworCWZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIjt9CitzcGFuLkJvZHlUZXh0Q2hhcgorCXttc28tc3R5bGUtbmFtZToiQm9keSBUZXh0IENoYXIiOworCW1zby1zdHlsZS1saW5rOiJCb2R5IFRleHQiO30KKyAvKiBQYWdlIERlZmluaXRpb25zICovCisgQHBhZ2UgV29yZFNlY3Rpb24xCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjEKKwl7cGFnZTpXb3JkU2VjdGlvbjE7fQorQHBhZ2UgV29yZFNlY3Rpb24yCisJe3NpemU6NTk1LjQ1cHQgODQxLjdwdDsKKwltYXJnaW46NzIuMHB0IDkwLjBwdCA3Mi4wcHQgOTAuMHB0O30KK2Rpdi5Xb3JkU2VjdGlvbjIKKwl7cGFnZTpXb3JkU2VjdGlvbjI7fQorIC8qIExpc3QgRGVmaW5pdGlvbnMgKi8KKyBvbAorCXttYXJnaW4tYm90dG9tOjBjbTt9Cit1bAorCXttYXJnaW4tYm90dG9tOjBjbTt9CistLT4KKzwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz1FTi1VUyBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgorCis8ZGl2IGNsYXNzPVdvcmRTZWN0aW9uMT4KKworPHAgY2xhc3M9TXNvVGl0bGU+Rm9yd2FyZCBMb2NrIENvbnZlcnRlciBBbmQgRGVjb2RlcjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbgorY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDIyIj4xPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7CitsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LXdlaWdodDpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPkludHJvZHVjdGlvbjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0OworZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyMyI+MjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPk92ZXJ2aWV3PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4zPC9zcGFuPjwvYT48L3NwYW4+PC9wPgorCis8cCBjbGFzcz1Nc29Ub2MxPjxzcGFuIGNsYXNzPU1zb0h5cGVybGluaz48YSBocmVmPSIjX1RvYzI3NjQ3MTQyNCI+MzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7dGV4dC10cmFuc2Zvcm06bm9uZTsKK2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoKAgPC9zcGFuPlVzZSBDYXNlczxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjQ8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzI+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxzcGFuIHN0eWxlPSdmb250LXZhcmlhbnQ6bm9ybWFsICFpbXBvcnRhbnQ7Cit0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2UnPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDI1Ij4zLjE8c3BhbiBzdHlsZT0nZm9udC1zaXplOgorMTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtZGVjb3JhdGlvbjoKK25vbmUnPqCgoKCgoKAgPC9zcGFuPkNvbnZlcnRlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz40PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjYiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IERhdGEgKFB1c2gtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+NDwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjciPjMuMS4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5Db252ZXJ0IEZpbGUgKFB1bGwtTW9kZSBDb252ZXJzaW9uKTxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+Njwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+RGVjb2RlcjxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz43PC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5DaGVjayBJbnRlZ3JpdHk8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+ODwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMz48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzAiPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDtmb250LXN0eWxlOm5vcm1hbDsKK3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgIDwvc3Bhbj5HZXQgQ29udGVudCBUeXBlPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjk8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzM+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMxIj4zLjIuMzxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEyLjBwdDtsaW5lLWhlaWdodDoxNTAlO2NvbG9yOndpbmRvd3RleHQ7Zm9udC1zdHlsZTpub3JtYWw7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+oKCgoCA8L3NwYW4+RGVjb2RlIEZpbGU8c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDsKK2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTA8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb1RvYzE+PHNwYW4gY2xhc3M9TXNvSHlwZXJsaW5rPjxhIGhyZWY9IiNfVG9jMjc2NDcxNDMyIj40PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTIuMHB0O2xpbmUtaGVpZ2h0OjE1MCU7Y29sb3I6d2luZG93dGV4dDt0ZXh0LXRyYW5zZm9ybTpub25lOworZm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lJz6goKCgoCA8L3NwYW4+RGVmaW5pdGlvbiBvZiB0aGUKK0ludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDxzcGFuIHN0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTsKK3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMTwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+S2V5IERlcml2YXRpb248c3BhbiBzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7Cit0ZXh0LWRlY29yYXRpb246bm9uZSc+Li4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjExPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMj48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PHNwYW4gc3R5bGU9J2ZvbnQtdmFyaWFudDpub3JtYWwgIWltcG9ydGFudDsKK3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZSc+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzQiPjQuMjxzcGFuIHN0eWxlPSdmb250LXNpemU6CisxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7dGV4dC1kZWNvcmF0aW9uOgorbm9uZSc+oKCgoKCgoCA8L3NwYW4+Q2FsY3VsYXRpb24gb2YgdGhlIENvdW50ZXJzPHNwYW4gc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7CitkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPi4gPC9zcGFuPjxzcGFuCitzdHlsZT0nY29sb3I6d2luZG93dGV4dDtkaXNwbGF5Om5vbmU7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPjEyPC9zcGFuPjwvYT48L3NwYW4+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzUiPjU8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5Vbml0IFRlc3QgQ2FzZXM8c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4uIDwvc3Bhbj48c3Bhbgorc3R5bGU9J2NvbG9yOndpbmRvd3RleHQ7ZGlzcGxheTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lJz4xMjwvc3Bhbj48L2E+PC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvVG9jMT48c3BhbiBjbGFzcz1Nc29IeXBlcmxpbms+PGEgaHJlZj0iI19Ub2MyNzY0NzE0MzYiPjY8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMi4wcHQ7bGluZS1oZWlnaHQ6MTUwJTtjb2xvcjp3aW5kb3d0ZXh0O3RleHQtdHJhbnNmb3JtOm5vbmU7Citmb250LXdlaWdodDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmUnPqCgoKCgIDwvc3Bhbj5SZWZlcmVuY2VzPHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+LiA8L3NwYW4+PHNwYW4KK3N0eWxlPSdjb2xvcjp3aW5kb3d0ZXh0O2Rpc3BsYXk6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZSc+MTI8L3NwYW4+PC9hPjwvc3Bhbj48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjwvcD4KKworPC9kaXY+CisKKzxzcGFuIHN0eWxlPSdmb250LXNpemU6MTIuMHB0O2ZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiInPjxicgorY2xlYXI9YWxsIHN0eWxlPSdwYWdlLWJyZWFrLWJlZm9yZTpyaWdodCc+Cis8L3NwYW4+CisKKzxkaXYgY2xhc3M9V29yZFNlY3Rpb24yPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzQiPjE8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+SW50cm9kdWN0aW9uPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQgaXMgdXNlZCBmb3IgZW5jcnlwdGluZworaW5oZXJlbnRseSB1bmVuY3J5cHRlZCBPTUEgRFJNIHZlcnNpb24gMSBGb3J3YXJkIExvY2sgYW5kIENvbWJpbmVkIERlbGl2ZXJ5CitmaWxlcyBzbyB0aGV5IGNhbiBiZSBzZWN1cmVseSBzdG9yZWQgb24gZXh0ZXJuYWxseSBhY2Nlc3NpYmxlIGZpbGUgc3lzdGVtIHBhcnRpdGlvbnMKK3N1Y2ggYXMgbWVtb3J5IHN0aWNrLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+T3VyIGdlbmVyYWwgc3RyYXRlZ3kgaXMgdG8gY29udmVydCBzdWNoIDxpPk9NQSBEUk0gTWVzc2FnZTwvaT4KKyiRLmRtkikgZmlsZXMgdG8gaW50ZXJuYWwgRm9yd2FyZCBMb2NrICiRLmZskikgZmlsZXMgYXMgc29vbiBhcyB0aGV5IGFyZQorZG93bmxvYWRlZCBvciBvdGhlcndpc2UgdHJhbnNmZXJyZWQgdG8gdGhlIHBob25lLCBhbmQgbm90IGFjdHVhbGx5IHByb3ZpZGUgYW55CitkZWNvZGVycyBmb3IgkS5kbZIgZmlsZXMuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyMyI+MjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5PdmVydmlldzwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgPGk+Rm9yd2FyZCBMb2NrIENvbnZlcnRlcjwvaT4gY29udmVydHMgT01BIERSTSBNZXNzYWdlCitmaWxlcyB0byB0aGUgaW50ZXJuYWwgZmlsZSBmb3JtYXQuIFRoZSA8aT5Gb3J3YXJkIExvY2sgRGVjb2RlcjwvaT4gcHJvdmlkZXMgYQorUE9TSVgtbGV2ZWwgQVBJIGZvciB0cmFuc3BhcmVudCByZWFkaW5nIGFuZCBzZWVraW5nIHRocm91Z2ggc3VjaCBhIGNvbnZlcnRlZAorZmlsZSBhcyBpZiBpdCB3ZXJlIHVuZW5jcnlwdGVkLiBUaGUgQVBJIGFsc28gaW5jbHVkZXMgZnVuY3Rpb25zIGZvciBjaGVja2luZyBhCitmaWxlknMgaW50ZWdyaXR5IGFuZCBnZXR0aW5nIHRoZSBNSU1FIHR5cGUgb2YgaXRzIGVtYmVkZGVkIGNvbnRlbnQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPlRoZSBjb252ZXJ0ZXIgYW5kIGRlY29kZXIgYXJlCitidWlsdCBpbnRvIHR3byBzZXBhcmF0ZSBsaWJyYXJpZXMsIHdoaWNoIHNoYXJlIGNvbW1vbiBjb2RlIGZvciByYW5kb20gbnVtYmVyCitnZW5lcmF0aW9uIGFuZCBrZXkgZW5jcnlwdGlvbiBpbiBhIHRoaXJkIGxpYnJhcnkuIEZvciB0ZXN0IHB1cnBvc2VzIHRoZXJlIGlzCithbHNvIGEgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLiBTZWUgRmlndXJlIDEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD0yODggaGVpZ2h0PTM2NAorc3JjPSJpbWFnZXMvaW1hZ2UwMDEuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6MTIuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjI3MzA4ODUiPkZpZ3VyZSA8L2E+MS4gQmxvY2sgZGlhZ3JhbSBpbGx1c3RyYXRpbmcgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBleGVjdXRhYmxlIG1vZHVsZXMuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE2LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNCI+MzxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Vc2UgQ2FzZXM8L2E+PC9oMT4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBhbGwgdGhlIHVzZSBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlcgorYW5kIGRlY29kZXIuIEl0IHNob3dzIHRoZSBzZXF1ZW5jZSBvZiBBUEkgY2FsbHMgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzb2x2ZQordGhlc2UgdXNlIGNhc2VzLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjUiPjMuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5Db252ZXJ0ZXI8L2E+PC9oMj4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhyb3VnaCB0aGUgY29udmVydGVyIEFQSSwgY29udmVyc2lvbiBjYW4gYmUgcGVyZm9ybWVkIGluIG9uZQorb2YgdHdvIHdheXM6PC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjEuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1c2gtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY2xpZW50IHByb2dyZXNzaXZlbHkgZmVlZHMgZGF0YSB0byB0aGUgY29udmVydGVyIGFzCitpdCBhcnJpdmVzLiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gZGF0YSBhcnJpdmVzIGdyYWR1YWxseSBpbiBjaHVua3MsIHdpdGgKK2lkbGUgdGltZSBpbiBiZXR3ZWVuLiBDb25zZXF1ZW50bHksIHB1c2ggbW9kZSBpcyB1c2VkIGZvciBjb252ZXJ0aW5nIGZpbGVzCitiZWluZyBkb3dubG9hZGVkIHRocm91Z2ggSFRUUC4gU2VlIHNlY3Rpb24gMy4xLjEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPlB1bGwtbW9kZQorY29udmVyc2lvbjwvaT4gaXMgd2hlbiB0aGUgY29udmVydGVyIGRyaXZlcyB0aGUgcHJvY2VzcyBhbmQgY29uc3VtZXMgZGF0YSBmcm9tCit0aGUgY2xpZW50IGFzIGl0IG5lZWRzIGl0LiBUaGlzIGlzIGFwcHJvcHJpYXRlIHdoZW4gdGhlIGVudGlyZSBmaWxlIHRvIGJlCitjb252ZXJ0ZWQgaXMgcmVhZGlseSBhdmFpbGFibGUuIEhlbmNlLCBwdWxsIG1vZGUgaXMgdXNlZCBieSB0aGUgdW5pdCB0ZXN0IGFwcGxpY2F0aW9uLgorU2VlIHNlY3Rpb24gMy4xLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCBwdWxsLW1vZGUgY29udmVyc2lvbiBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcworb2YgdGhlIEFQSSBmb3IgcHVzaC1tb2RlIGNvbnZlcnNpb24uPC9wPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQyNiI+PC9hPjxhIG5hbWU9Il9SZWYyNjMwODU0NzgiPjMuMS4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNvbnZlcnQgRGF0YQorKFB1c2gtTW9kZSBDb252ZXJzaW9uKTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5QdXNoLW1vZGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYXMgZm9sbG93cyAoc2VlIGFsc28gRmlndXJlIDIpOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X09wZW5TZXNzaW9uPC9zcGFuPgoraW5pdGlhbGl6ZXMgdGhlIG91dHB1dCBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSA8aT5zZXNzaW9uIElEPC9pPiB0byBiZSB1c2VkIGluCitzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSBBUEkuIFRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIGEgdW5pb24gb2YgcmV0dXJuIHZhbHVlcword2hvc2UgY29ycmVjdCB1c2UgYXQgYW55IGdpdmVuIG1vbWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBBUEkgZnVuY3Rpb24gbGFzdAorY2FsbGVkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tDb252X0NvbnZlcnREYXRhPC9zcGFuPgoraXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgbm8gbW9yZSBpbnB1dCBkYXRhIHJlbWFpbnMuIEVhY2ggY2FsbCBjb252ZXJ0cyB0aGUKK21heGltdW0gYW1vdW50IG9mIGRhdGEgcG9zc2libGUgYW5kIHdyaXRlcyBpdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGNsaWVudCB0aGVuCit3cml0ZXMgdGhpcyBkYXRhIHRvIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0NvbnZfQ2xvc2VTZXNzaW9uPC9zcGFuPgorY2xlYW5zIHVwIHRoZSBzZXNzaW9uIGFuZCBkZWFsbG9jYXRlcyB0aGUgb3V0cHV0IGJ1ZmZlci4gSWYgYWxsIGhhcyBnb25lIHdlbGwsIGEKK3R3by1wYXJ0IGNyeXB0b2dyYXBoaWMgc2lnbmF0dXJlIG9mIHRoZSBvdXRwdXQgZmlsZSBpcyBjYWxjdWxhdGVkLiBUaGUgY2xpZW50CittdXN0IGdvIGJhY2sgYW5kIHJld3JpdGUgcGFydCBvZiB0aGUgZmlsZSBoZWFkZXIgd2l0aCB0aGlzIHVwZGF0ZWQgc2lnbmF0dXJlCitpbmZvcm1hdGlvbi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkV2ZXJ5IHRpbWUgYSBmaWxlIGlzIGJlaW5nIGNvbnZlcnRlZCwgdGhlIGNvbnZlcnRlciBjYWxscyA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldFJhbmRvbU51bWJlcjwvc3Bhbj4KK3RvIGdlbmVyYXRlIGEgbmV3LCB1bmlxdWUgc2Vzc2lvbiBrZXkuIE5vIHR3byBjb252ZXJ0ZWQgZmlsZXMgbG9vayBhbGlrZSwgZXZlbgoraWYgdGhlIG9yaWdpbmFsIGZpbGVzIGFyZSB0aGUgc2FtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUgcmFuZG9tIGJ5dGVzIGNhbm5vdCBjb21lIGZyb20gYW55IGJhcmUtbWluaW11bQoraW1wbGVtZW50YXRpb24gb2YgdGhlIEMtbGlicmFyeSA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+cmFuZDwvc3Bhbj4KK2Z1bmN0aW9ul3RoZXkgbXVzdCBiZSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUuIE90aGVyd2lzZSwgc2VjdXJpdHkgd2lsbCBiZQorY29tcHJvbWlzZWQuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgaXMgZW5jcnlwdGVkIGFuZCBzdG9yZWQgd2l0aGluIHRoZQorY29udmVydGVkIGZpbGUuIEtleSBlbmNyeXB0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrR2x1ZV9HZXRFbmNyeXB0ZWRLZXlMZW5ndGg8L3NwYW4+IGFuZCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0VuY3J5cHRLZXk8L3NwYW4+LgorVGhlc2UgdHdvIGZ1bmN0aW9ucywgdG9nZXRoZXIgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkZWNyeXB0aW9uIGZ1bmN0aW9uICg8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0RlY3J5cHRLZXk8L3NwYW4+KSwKK2FyZSB0aGUgaW50ZWdyYXRpb24gcG9pbnRzIHdoZXJlIGFuIE9FTSBtYW51ZmFjdHVyZXIgbWF5IGltcGxlbWVudCB0aGVpciBvd24KK2tleS1lbmNyeXB0aW9uIHNjaGVtZS48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PjxiPk5vdGU6PC9iPiBUaGUga2V5LWVuY3J5cHRpb24ga2V5IG11c3QgYmUgdW5pcXVlIHRvIGVhY2gKK2RldmljZTsgdGhpcyBpcyB3aGF0IG1ha2VzIHRoZSBmaWxlcyBmb3J3YXJkIGxvY2uWcHJvdGVjdGVkLiBJZGVhbGx5LCBpdCBzaG91bGQKK2JlIGRlcml2ZWQgZnJvbSBzZWNyZXQgaGFyZHdhcmUgcGFyYW1ldGVycywgYnV0IGF0IHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZCBiZQorcGVyc2lzdGVudCBmcm9tIG9uZSBtYXN0ZXIgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgorCis8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OworYmFja2dyb3VuZDojRjJGMkYyJz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J2JhY2tncm91bmQ6I0YyRjJGMjtib3JkZXI6Citub25lO3BhZGRpbmc6MGNtJz48Yj5Ob3RlOjwvYj4gSW4gdGhlIG9wZW4tc291cmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxpYmZ3ZGxvY2stY29tbW9uPC9zcGFuPgorbGlicmFyeSwgYSByYW5kb20ga2V5LWVuY3J5cHRpb24ga2V5IGlzIGdlbmVyYXRlZCBhbmQgc3RvcmVkIGluIHBsYWludGV4dCBpbgordGhlIGZpbGUgc3lzdGVtLCB3aXRob3V0IGJlaW5nIG9iZnVzY2F0ZWQgaW4gYW55IHdheSAoZG9pbmcgc28gd291bGQgYmUgZnV0aWxlCitzaW5jZSB0aGUgc291cmNlIGNvZGUgaXMgb3Blbmx5IGF2YWlsYWJsZSkuIFRoaXMga2V5IG11c3QgYmUga2VwdCBzZWNyZXQgZnJvbQordGhlIHVzZXIsIGFuZCBzaG91bGRuknQgYmUgcG9zc2libGUgdG8gZXh0cmFjdCB0aHJvdWdoIGJhY2t1cC1hbmQtcmVzdG9yZQorZnVuY3Rpb25hbGl0eSBvciB0aGUgbGlrZS4gT0VNIG1hbnVmYWN0dXJlcnMgd2lsbCBwcm9iYWJseSB3YW50IHRvIGltcGxlbWVudCBhCit0cnVseSBoYXJkd2FyZS1iYXNlZCBkZXZpY2UtdW5pcXVlIGtleS48L3A+CisKKzwvZGl2PgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01MzEgaGVpZ2h0PTU2Mworc3JjPSJpbWFnZXMvaW1hZ2UwMDIuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzA4NTE4NyI+RmlndXJlIDwvYT4yLiBDb252ZXJ0ZXIgVUM6IENvbnZlcnQgRGF0YS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTMuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMz48YSBuYW1lPSJfVG9jMjc2NDcxNDI3Ij48L2E+PGEgbmFtZT0iX1JlZjI2MzE2MzA4MiI+My4xLjI8c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+Q29udmVydCBGaWxlCisoUHVsbC1Nb2RlIENvbnZlcnNpb24pPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlB1bGwtbW9kZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBieSBjYWxsaW5nIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ29udmVydEZpbGU8L3NwYW4+Cit3aXRoIHRoZSBmaWxlbmFtZSwgdW5sZXNzIHRoZXJlIGlzIG5lZWQgZm9yIGEgc3BlY2lhbGl6ZWQgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5yZWFkPC9zcGFuPiBmdW5jdGlvbiwgaW4KK3doaWNoIGNhc2UgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX0NvbnZlcnRPcGVuRmlsZTwvc3Bhbj4KK3Nob3VsZCBiZSB1c2VkIGRpcmVjdGx5IGluc3RlYWQuIFNlZSBGaWd1cmUgMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+SW50ZXJuYWxseSwgPHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0RmlsZTwvc3Bhbj4KK2NhbGxzIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9Db252ZXJ0T3BlbkZpbGU8L3NwYW4+LgorVGhlIGxhdHRlciB0aGVuIHByb2NlZWRzIHdpdGggdGhlIGNvbnZlcnNpb24gdXNpbmcgdGhlIHB1c2gtbW9kZSBBUEksIGFjdGluZyBhcwordGhlIGNsaWVudCBpbiB0aGUgcHJldmlvdXMgdXNlIGNhc2U7IHNlZSBzZWN0aW9uIDMuMS4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpbWcgd2lkdGg9NTMxIGhlaWdodD03MzEKK3NyYz0iaW1hZ2VzL2ltYWdlMDAzLmdpZiI+PC9wPgorCis8cCBjbGFzcz1Nc29DYXB0aW9uIHN0eWxlPSdtYXJnaW4tdG9wOjYuMHB0O21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbToKKzEyLjBwdDttYXJnaW4tbGVmdDowY20nPjxhIG5hbWU9Il9SZWYyNjMwODUyMDgiPkZpZ3VyZSA8L2E+My4gQ29udmVydGVyIFVDOiBDb252ZXJ0IEZpbGUuPC9wPgorCis8Yj48aT48c3BhbiBzdHlsZT0nZm9udC1zaXplOjE0LjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9pPjwvYj4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjgiPjMuMjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5EZWNvZGVyPC9hPjwvaDI+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlRoZSBkZWNvZGVyIEFQSSBhbGxvd3MgdGhlIGNsaWVudCB0byBkbyB0aGUgZm9sbG93aW5nOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5DaGVjawordGhlIGludGVncml0eSBvZiBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSwgaS5lLiwgZGV0ZWN0IHdoZXRoZXIgaXQgaGFzCitiZWVuIG1hbmlwdWxhdGVkIGluIGFueSB3YXk7IHNlZSBzZWN0aW9uIDMuMi4xLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4yLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5HZXQKK3RoZSBNSU1FIHR5cGUgb2YgdGhlIGVtYmVkZGVkIGNvbnRlbnQgKHRoZSCTb3JpZ2luYWyUIE1JTUUgdHlwZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24KK3dhcyBhcHBsaWVkKTsgc2VlIHNlY3Rpb24gMy4yLjIuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZQordGhlIGZpbGUgYnkgcmFuZG9tIGFjY2VzcywgaS5lLiwgcmVhZCBhbmQgc2VlayB0aHJvdWdoIGl0IGluIGFuIGFyYml0cmFyeQorbWFubmVyOyBzZWUgc2VjdGlvbiAzLjIuMy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFsbCBzdWJzZXF1ZW50IG9wZXJhdGlvbnMgb24gYSBmaWxlIGZpcnN0IHJlcXVpcmUgaXQgdG8gYmUKK29wZW5lZC4gT3BlbmluZyBhIGZpbGUgcmV0dXJucyBhIDxpPmZpbGUgZGVzY3JpcHRvcjwvaT6XYSBoYW5kbGUgdG8gYmUgdXNlZCBpbgordGhlc2Ugc3Vic2VxdWVudCBvcGVyYXRpb25zLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgdGhlIGZpbGVuYW1lIGlzIGtub3duLCBhbiBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZQorY2FuIGJlIG9wZW5lZCB1c2luZyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4uCitJZiBvbmx5IHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gYWxyZWFkeSBvcGVuIGZpbGUgaXMgYXZhaWxhYmxlLCBhIGRlY29kaW5nCitzZXNzaW9uIGNhbiBpbnN0ZWFkIGJlIGluaXRpYWxpemVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5JbnRlcm5hbGx5LCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToKKyJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPiBjYWxscyA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9hdHRhY2g8L3NwYW4+LiBGb3IgZWZmaWNpZW5jeQorcmVhc29ucywgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4KK3RoZXJlZm9yZSBhc3N1bWVzIHRoYXQgdGhlIGZpbGUgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSB3aGVuCit0aGUgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuIEEgY2xpZW50IHdobyBjYWxscyBpdCBkaXJlY3RseSBtdXN0IG1ha2Ugc3VyZSB0aGF0Cit0aGlzIGFzc3VtcHRpb24gaG9sZHMuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5XaGVuIGEgZmlsZSBpcyBiZWluZyBhdHRhY2hlZCwgdGhlIHNlc3Npb24ga2V5IHN0b3JlZCBpbgordGhlIGZpbGUgZHVyaW5nIGNvbnZlcnNpb24gaXMgZGVjcnlwdGVkIHVzaW5nIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tHbHVlX0dldEVuY3J5cHRlZEtleUxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0dsdWVfRGVjcnlwdEtleTwvc3Bhbj4sCitpbiBvcmRlciB0byBzZXQgdXAgZm9yIGRlY29kaW5nIGFuZCBpbnRlZ3JpdHkgY2hlY2tpbmcuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Gb3IganVzdCBnZXR0aW5nIHRoZSBjb250ZW50IHR5cGUsIGhvd2V2ZXIsIHJldHJpZXZpbmcgdGhlCitzZXNzaW9uIGtleSB3b3VsZCBzdHJpY3RseSBzcGVha2luZyBub3QgYmUgbmVjZXNzYXJ5LCBzbyB0aGVyZSBpcyBhbgorb3Bwb3J0dW5pdHkgaGVyZSB0byBvcHRpbWl6ZSBmb3IgdGhhdCBpZiBpdCBwcm92ZXMgbmVjZXNzYXJ5IGxhdGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+U3ltbWV0cmljYWwgdG8gPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6CisiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfb3Blbjwvc3Bhbj4gYW5kIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0OworZm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2F0dGFjaDwvc3Bhbj4sIHRoZXJlIGFyZSBhbHNvIGZ1bmN0aW9ucworZm9yIGNsb3NpbmcgYSBmaWxlIG9yIGRldGFjaGluZyBmcm9tIGl0OjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj5JZgoraXQgd2FzIG9wZW5lZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9vcGVuPC9zcGFuPgoraXQgc2hvdWxkIGJlIGNsb3NlZCB3aXRoIDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9jbG9zZTwvc3Bhbj4uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPklmCitpdCB3YXMgYXR0YWNoZWQgd2l0aCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfYXR0YWNoPC9zcGFuPgoraXQgc2hvdWxkIGJlIGRldGFjaGVkIHdpdGggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2RldGFjaDwvc3Bhbj4uPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1JlZjI2MzE2MzA5OSI+PC9hPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MjkiPjMuMi4xPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkNoZWNrIEludGVncml0eTwvYT48L2gzPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGVyZSBhcmUgdGhyZWUgbWV0aG9kcyBmb3IgY2hlY2tpbmcgdGhlIGludGVncml0eSBvZiBhbgoraW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUsIGluIHdob2xlIG9yIGluIHBhcnQgKHNlZSBhbHNvIEZpZ3VyZSA0KTo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+PHNwYW4KK3N0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9DaGVja0RhdGFJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggY2hlY2tzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGZpbGUgaGVhZGVyLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhbmQKK290aGVyIGZpZWxkcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBidXQgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjMuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tJbnRlZ3JpdHk8L3NwYW4+LAord2hpY2ggaW50ZXJuYWxseSBjYWxscyBmaXJzdCA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+CithbmQgdGhlbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPi48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdCc+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tIZWFkZXJJbnRlZ3JpdHk8L3NwYW4+IGlzCitnZW5lcmFsbHkgbXVjaCBmYXN0ZXIgdGhhbiA8c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+RndkTG9ja0ZpbGVfQ2hlY2tEYXRhSW50ZWdyaXR5PC9zcGFuPiwKK3dob3NlIHJ1bm5pbmcgdGltZSBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGZpbGUuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTU3NQorc3JjPSJpbWFnZXMvaW1hZ2UwMDQuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2MzMwOCI+RmlndXJlIDwvYT40LiBEZWNvZGVyIFVDOiBDaGVjayBJbnRlZ3JpdHkuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMCI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMTciPjMuMi4yPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkdldCBDb250ZW50IFR5cGU8L2E+PC9oMz4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1ib3R0b206MjQuMHB0Jz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdDsKK2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz5Gd2RMb2NrRmlsZV9HZXRDb250ZW50VHlwZTwvc3Bhbj4gcmV0dXJucyBhCityZWFkLW9ubHkgcmVmZXJlbmNlIHRvIGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlCitlbWJlZGRlZCBjb250ZW50LiBUaGlzIHJlZmVyZW5jZSBpcyB2YWxpZCBhcyBsb25nIGFzIHRoZSBmaWxlIGlzIGtlcHQgb3Blbi4KK0NsaWVudHMgd2hvIG5lZWQgYWNjZXNzIHRvIHRoZSBjb250ZW50IHR5cGUgYWZ0ZXIgY2xvc2luZyB0aGUgZmlsZSBzaG91bGQgbWFrZQorYSBjb3B5IG9mIHRoZSBzdHJpbmcuIFNlZSBGaWd1cmUgNSBiZWxvdy48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aW1nIHdpZHRoPTU0MyBoZWlnaHQ9NDg4CitzcmM9ImltYWdlcy9pbWFnZTAwNS5naWYiPjwvcD4KKworPHAgY2xhc3M9TXNvQ2FwdGlvbiBzdHlsZT0nbWFyZ2luLXRvcDo2LjBwdDttYXJnaW4tcmlnaHQ6MGNtO21hcmdpbi1ib3R0b206CisxMi4wcHQ7bWFyZ2luLWxlZnQ6MGNtJz48YSBuYW1lPSJfUmVmMjYzMTYzMzkyIj5GaWd1cmUgPC9hPjUuIERlY29kZXIgVUM6IEdldCBDb250ZW50IFR5cGUuPC9wPgorCis8Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEzLjBwdDtmb250LWZhbWlseToiQXJpYWwiLCJzYW5zLXNlcmlmIic+PGJyCitjbGVhcj1hbGwgc3R5bGU9J3BhZ2UtYnJlYWstYmVmb3JlOmFsd2F5cyc+Cis8L3NwYW4+PC9iPgorCis8aDM+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzMSI+PC9hPjxhIG5hbWU9Il9SZWYyNjMxNjMxMzciPjMuMi4zPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPkRlY29kZSBGaWxlPC9hPjwvaDM+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PkFmdGVyIG9wZW5pbmcgYW4gaW50ZXJuYWwgRm9yd2FyZCBMb2NrIGZpbGUgKG9yIGF0dGFjaGluZwordG8gYW4gYWxyZWFkeSBvcGVuIG9uZSksIGl0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHJlYWQgZnJvbSBhcyBpZiBpdCB3ZXJlCit1bmVuY3J5cHRlZC4gQW55IG51bWJlciBvZiBjYWxscyB0byByZWFkIGRhdGEgZnJvbSB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIG9yCitzZXQgaXQgdG8gYSBuZXcgb25lICh3aGljaCBpcyB3aGF0IDxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OgorIkx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiBkb2VzKSBjYW4gYmUgbWFkZSBpbiBhbnkgb3JkZXI7IHRoaXMgaXMgd2hhdCB3ZQorY2FsbCA8aT5yYW5kb20gYWNjZXNzPC9pPi4gU2VlIEZpZ3VyZSA2LjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIEZvcndhcmQgTG9jayBEZWNvZGVyIHZlcnNpb25zIG9mIHRoZSA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPnJlYWQ8L3NwYW4+LCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPmxzZWVrPC9zcGFuPiwgYW5kIDxzcGFuCitzdHlsZT0nZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Y2xvc2U8L3NwYW4+IGZ1bmN0aW9ucworaGF2ZSB0aGUgZXhhY3Qgc2FtZSBzaWduYXR1cmVzIGFzIHRoZWlyIFBPU0lYIGNvdW50ZXJwYXJ0cy4gU28sIGZvciBleGFtcGxlLAordGhlIGNhbGwgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX2xzZWVrKGZkLAorMCwgU0VFS19FTkQpPC9zcGFuPiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBlbWJlZGRlZCBjb250ZW50IGRhdGEsIGkuZS4sIHRoZQorc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgRFJNIHByb3RlY3Rpb24uPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToyNC4wcHQnPk1vcmVvdmVyLCA8c3Bhbgorc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPkZ3ZExvY2tGaWxlX29wZW48L3NwYW4+CitpcyBsaWtlIHJlZ3VsYXIgUE9TSVggPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIiwiRGVqYVZ1IFNhbnMgTW9ubyInPm9wZW48L3NwYW4+CitleGNlcHQgaXQgdGFrZXMgb25seSB0aGUgZmlsZW5hbWUgYXMgYSBwYXJhbWV0ZXKXYWNjZXNzIGlzIGFsd2F5cyByZWFkLW9ubHkuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGltZyB3aWR0aD01NDMgaGVpZ2h0PTUyMgorc3JjPSJpbWFnZXMvaW1hZ2UwMDYuZ2lmIj48L3A+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbSc+PGEgbmFtZT0iX1JlZjI2MzE2NjMwMyI+RmlndXJlIDwvYT42LiBEZWNvZGVyIFVDOiBEZWNvZGUgRmlsZS48L3A+CisKKzxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTYuMHB0O2ZvbnQtZmFtaWx5OiJBcmlhbCIsInNhbnMtc2VyaWYiJz48YnIKK2NsZWFyPWFsbCBzdHlsZT0ncGFnZS1icmVhay1iZWZvcmU6YWx3YXlzJz4KKzwvc3Bhbj48L2I+CisKKzxoMT48YSBuYW1lPSJfVG9jMjc2NDcxNDMyIj40PHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkRlZmluaXRpb24gb2YgdGhlIEludGVybmFsIEZvcndhcmQgTG9jayBGaWxlIEZvcm1hdDwvYT48L2gxPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWJvdHRvbToxMi4wcHQnPlRoZSBpbm5lciBzdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuYWwKK0ZvcndhcmQgTG9jayBmaWxlIGlzIGRlZmluZWQgaW4gVGFibGUgMSBiZWxvdy48L3A+CisKKzx0YWJsZSBjbGFzcz1Nc29Ob3JtYWxUYWJsZSBib3JkZXI9MSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAKKyBzdHlsZT0nYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlcjpub25lJz4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPk9mZnNldCBbYnl0ZXNdPC9iPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLWxlZnQ6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxiPlNpemUgW2J5dGVzXTwvYj48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci1sZWZ0Om5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48Yj5EZXNjcmlwdGlvbjwvYj48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4wPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+NDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBmaWxlIHNpZ25hdHVyZSAoc28tY2FsbGVkCisgIDxpPm1hZ2ljIG51bWJlcjwvaT4pOiBhIGZvdXItY2hhcmFjdGVyIGNvZGUgY29uc2lzdGluZyBvZiB0aGUgbGV0dGVycworICBGLVctTC1LLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjQ8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+VmVyc2lvbiBudW1iZXIgKDAgZm9yIHRoZQorICBmaXJzdCB2ZXJzaW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz41PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkluZGljYXRlcyB0aGUgc3ViZm9ybWF0OjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAwIEZvcndhcmQgTG9jazwvaT48L3A+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+MHgwMSBDb21iaW5lZCBEZWxpdmVyeTwvaT48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz42PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MTwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlVzYWdlIHJlc3RyaWN0aW9uIGZsYWdzIChwcm9oaWJpdGlvbnMKKyAgYWdhaW5zdCB1c2FnZSBhcyByaW5ndG9uZSBvciBhcyB3YWxscGFwZXIgYW5kIHNjcmVlbiBzYXZlcikuIEFsc28gaW5kaWNhdGVzCisgIGlmIHRoZSBmaWxlIGlzIGJvdW5kIHRvIGEgc3BlY2lmaWMgU0lNIGNhcmQuPC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDAgTm8gdXNhZ2UKKyAgcmVzdHJpY3Rpb25zPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT4weDAxIFJpbmd0b25lIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4MDIgU2NyZWVuIHVzYWdlCisgIHByb2hpYml0ZWQ8L2k+PC9wPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPjB4ODAgQm91bmQgdG8gU0lNPC9pPjwvcD4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4oQW55IG51bWJlciBvZiB0aGVzZSBtYXkgYmUKKyAgT1ItZWQgdG9nZXRoZXIuKTwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjc8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4xPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+TGVuZ3RoIG9mIHRoZSBNSU1FIGNvbnRlbnQKKyAgdHlwZSAoPGk+azwvaT4pLjwvcD4KKyAgPC90ZD4KKyA8L3RyPgorIDx0cj4KKyAgPHRkIHdpZHRoPTExMSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo4My40cHQ7Ym9yZGVyOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIGJvcmRlci10b3A6bm9uZTtwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjg8L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48aT5rPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBNSU1FIGNvbnRlbnQgdHlwZQorICAoQVNDSUktZW5jb2RlZCB3aXRob3V0IG51bGwtY2hhcmFjdGVyIHRlcm1pbmF0aW9uKS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bCA8L2k+PSAwIG9yIDE2PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIHN1YmZvcm1hdCBpcworICBDb21iaW5lZCBEZWxpdmVyeSwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgYXV0by1nZW5lcmF0ZWQgY29udGVudCBJRCAoMTYmbmJzcDtieXRlcykuCisgIElmIG5vdCwgdGhpcyBmaWVsZCBpcyB6ZXJvLXNpemUuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPm0gPC9pPj0gMCBvciA5PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+SWYgdGhlIGZpbGUgaXMgYm91bmQgdG8gYQorICBzcGVjaWZpYyBTSU0gY2FyZCwgdGhpcyBmaWVsZCBjb250YWlucyB0aGUgOS1ieXRlIHBhY2tlZCBJTVNJIG51bWJlci4gSWYgbm90LAorICB0aGlzIGZpZWxkIGlzIHplcm8tc2l6ZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz44KzxpPms8L2k+KzxpPmw8L2k+KzxpPm08L2k+PC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9OTYgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6NzIuMHB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lOworICBib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+PGk+bjwvaT4gJiM4ODA1OyAxNjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPlRoZSBlbmNyeXB0ZWQgc2Vzc2lvbiBrZXksIHRoZQorICBmaXJzdCBzaXh0ZWVuIGJ5dGVzIG9mIHdoaWNoIGFyZSBhbHNvIHVzZWQgYXMgdGhlIENUUi1tb2RlIDxpPm5vbmNlPC9pPiAoc2ltaWxhcgorICB0byB0aGUgQ0JDLW1vZGUgPGk+aW5pdGlhbGl6YXRpb24gdmVjdG9yPC9pPikuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjIwPC9wPgorICA8L3RkPgorICA8dGQgd2lkdGg9MzYxIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjI3MC44NXB0O2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDoKKyAgbm9uZTtib3JkZXItYm90dG9tOnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7Ym9yZGVyLXJpZ2h0OnNvbGlkIHdpbmRvd3RleHQgMS4wcHQ7CisgIHBhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+RGF0YSBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgdGhlIGVuY3J5cHRlZCBjb250ZW50IGRhdGEuPC9wPgorICA8L3RkPgorIDwvdHI+CisgPHRyPgorICA8dGQgd2lkdGg9MTExIHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjgzLjRwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgYm9yZGVyLXRvcDpub25lO3BhZGRpbmc6MGNtIDUuNHB0IDBjbSA1LjRwdCc+CisgIDxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ncGFnZS1icmVhay1hZnRlcjphdm9pZCc+MjgrPGk+azwvaT4rPGk+bDwvaT4rPGk+bTwvaT4rPGk+bjwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD05NiB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDo3Mi4wcHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7CisgIGJvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz4yMDwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTM2MSB2YWxpZ249dG9wIHN0eWxlPSd3aWR0aDoyNzAuODVwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6CisgIG5vbmU7Ym9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPkhlYWRlciBzaWduYXR1cmWXdGhlIFNIQS0xCisgIEhNQUMgb2YgYWxsIHRoZSBmaWVsZHMgYWJvdmUsIGluY2x1ZGluZyB0aGUgZW5jcnlwdGVkIHNlc3Npb24ga2V5IGFuZCBkYXRhCisgIHNpZ25hdHVyZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKyA8dHI+CisgIDx0ZCB3aWR0aD0xMTEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6ODMuNHB0O2JvcmRlcjpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBib3JkZXItdG9wOm5vbmU7cGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz40OCs8aT5rPC9pPis8aT5sPC9pPis8aT5tPC9pPis8aT5uPC9pPjwvcD4KKyAgPC90ZD4KKyAgPHRkIHdpZHRoPTk2IHZhbGlnbj10b3Agc3R5bGU9J3dpZHRoOjcyLjBwdDtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTsKKyAgYm9yZGVyLWJvdHRvbTpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0O2JvcmRlci1yaWdodDpzb2xpZCB3aW5kb3d0ZXh0IDEuMHB0OworICBwYWRkaW5nOjBjbSA1LjRwdCAwY20gNS40cHQnPgorICA8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J3BhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQnPjxpPiZsdDt0byB0aGUgZW5kIG9mIHRoZQorICBmaWxlJmd0OzwvaT48L3A+CisgIDwvdGQ+CisgIDx0ZCB3aWR0aD0zNjEgdmFsaWduPXRvcCBzdHlsZT0nd2lkdGg6MjcwLjg1cHQ7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0OgorICBub25lO2JvcmRlci1ib3R0b206c29saWQgd2luZG93dGV4dCAxLjBwdDtib3JkZXItcmlnaHQ6c29saWQgd2luZG93dGV4dCAxLjBwdDsKKyAgcGFkZGluZzowY20gNS40cHQgMGNtIDUuNHB0Jz4KKyAgPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz5UaGUgY29udGVudCBkYXRhIGVuY3J5cHRlZAorICB1c2luZyAxMjgtYml0IEFFUyBpbiBDVFIgbW9kZS48L3A+CisgIDwvdGQ+CisgPC90cj4KKzwvdGFibGU+CisKKzxwIGNsYXNzPU1zb0NhcHRpb24gc3R5bGU9J21hcmdpbi10b3A6Ni4wcHQ7bWFyZ2luLXJpZ2h0OjBjbTttYXJnaW4tYm90dG9tOgorMTIuMHB0O21hcmdpbi1sZWZ0OjBjbTtwYWdlLWJyZWFrLWFmdGVyOmF2b2lkJz48YSBuYW1lPSJfUmVmMTUxMjY5MjA2Ij5UYWJsZSA8L2E+MS4gRGVmaW5pdGlvbiBvZiB0aGUgZmllbGRzIG9mIGFuIGludGVybmFsIEZvcndhcmQgTG9jayBmaWxlLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+QXMgb2Ygbm93LCBuZWl0aGVyIENvbWJpbmVkIERlbGl2ZXJ5IG5vciB1c2FnZQorcmVzdHJpY3Rpb25zIChpbmNsdWRpbmcgU0lNIGJpbmRpbmcpIGFyZSBzdXBwb3J0ZWQuIFRoZXNlIGZpZWxkcyBhcmUgcmVzZXJ2ZWQKK2ZvciBmdXR1cmUgdXNlLjwvcD4KKworPGgyPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzMiPjQuMTxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5LZXkgRGVyaXZhdGlvbjwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5UaGUgc2Vzc2lvbiBrZXkgY29uc2lzdHMgb2Ygc2l4dGVlbiBieXRlcyBmZXRjaGVkIGZyb20gYQorY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBGcm9tIHRoZSBzZXNzaW9uIGtleSwgdHdvCitzZXBhcmF0ZSBrZXlzIGFyZSBkZXJpdmVkOiBvbmUgdXNlZCBmb3IgZW5jcnlwdGlvbiwgdGhlIG90aGVyIGZvciBzaWduaW5nLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGVuY3J5cHRpb24ga2V5IGlzIHRoZSBvdXRwdXQgZnJvbSBlbmNyeXB0aW5nIHRoZQorMTYtYnl0ZSBhbGwtemVybyBpbnB1dCBibG9jayB7MCwgMCwghSwgMH0gdXNpbmcgMTI4LWJpdCBBRVMgd2l0aCB0aGUgcmFuZG9tIHNlc3Npb24KK2tleSBhcyB0aGUga2V5LiBUaGUgc2lnbmluZyBrZXkgaXMgdGhlIG91dHB1dCBmcm9tIGVuY3J5cHRpbmcgdGhlIDE2LWJ5dGUgaW5wdXQKK2Jsb2NrIHsxLCAwLCCFLCAwfSB0aGUgc2FtZSB3YXkuIFRoZSBrZXlzIHNvIGRlcml2ZWQgd2lsbCBiZSBjcnlwdG9ncmFwaGljYWxseQoraW5kZXBlbmRlbnQgZnJvbSBlYWNoIG90aGVyLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIHNlc3Npb24ga2V5IGlzIGVuY3J5cHRlZCB1c2luZyBhIGhhcmR3YXJlLWRlcGVuZGVudAora2V5LWVuY3J5cHRpb24ga2V5IHVuaXF1ZSB0byBlYWNoIGRldmljZS4gVGhlIGVuY3J5cHRlZCBzZXNzaW9uIGtleSBpcyBzdG9yZWQKK2luc2lkZSB0aGUgZmlsZSwgYW5kIGl0cyBmaXJzdCBzaXh0ZWVuIGJ5dGVzIGFyZSBhbHNvIHVzZWQgYXMgdGhlIDxpPm5vbmNlPC9pPgorZm9yIHRoZSBDVFItbW9kZSBlbmNyeXB0aW9uIG9mIHRoZSBjb250ZW50IGRhdGEuPC9wPgorCis8aDI+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNCI+NC4yPHNwYW4gc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOworPC9zcGFuPkNhbGN1bGF0aW9uIG9mIHRoZSBDb3VudGVyczwvYT48L2gyPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dD5Vc2luZyBDVFIgKJNjb3VudGVylCkgbW9kZSwgYSBibG9jayBjaXBoZXIgc3VjaCBhcyBBRVMgY2FuCitiZSB0dXJuZWQgaW50byBhIHN0cmVhbSBjaXBoZXIuIFRoZSBwcm9jZXNzIG9mIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gaXMKK3dlbGwgZGVmaW5lZCBpbiBbMV0sIGV4Y2VwdCBmb3IgdGhlIHNwZWNpZmljcyBvZiB0aGUgY2FsY3VsYXRpb24gb2YgdGhlCitjb3VudGVycy4gRm9yIHRoZSBpbnRlcm5hbCBGb3J3YXJkIExvY2sgZmlsZSBmb3JtYXQsIHRoZSBjb3VudGVycyBhcmUKK2NhbGN1bGF0ZWQgYXMgZm9sbG93czo8L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+MS48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCitub25jZSBpcyBpbnRlcnByZXRlZCBhcyBhIDEyOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC48L3A+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDozNi4wcHQ7dGV4dC1pbmRlbnQ6LTE4LjBwdCc+Mi48c3Bhbgorc3R5bGU9J2ZvbnQ6Ny4wcHQgIlRpbWVzIE5ldyBSb21hbiInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L3NwYW4+VGhlCit6ZXJvLWJhc2VkIGJsb2NrIHNlcXVlbmNlIG51bWJlciAoYWxzbyBhIGxpdHRsZS1lbmRpYW4gdW5zaWduZWQgaW50ZWdlcikgaXMKK2FkZGVkIG1vZHVsbyAyPHN1cD4xMjg8L3N1cD4gdG8gdGhlIG5vbmNlIHRvIHByb2R1Y2UgdGhlIGNvdW50ZXIgZm9yIGEgZ2l2ZW4KK2Jsb2NrLjwvcD4KKworPGgxPjxhIG5hbWU9Il9Ub2MyNzY0NzE0MzUiPjU8c3BhbiBzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Cis8L3NwYW4+VW5pdCBUZXN0IENhc2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0PlVuaXQgdGVzdCBjYXNlcyBmb3IgdGhlIGNvbnZlcnRlciBhbmQgZGVjb2RlciBjb21lIGluIHR3bwordmFyaWV0aWVzOjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQgc3R5bGU9J21hcmdpbi1sZWZ0OjM2LjBwdDt0ZXh0LWluZGVudDotMTguMHB0Jz4xLjxzcGFuCitzdHlsZT0nZm9udDo3LjBwdCAiVGltZXMgTmV3IFJvbWFuIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvc3Bhbj48aT5CbGFjay1ib3g8L2k+Cit0ZXN0IGNhc2VzIGFpbSB0byB2ZXJpZnkgdGhhdCB5b3UgZ2V0IHNlbnNpYmxlIHJlc3VsdHMgZnJvbSBtYWxmb3JtZWQgb3IKK5N0cmlja3mUIGlucHV0IGRhdGEuPC9wPgorCis8cCBjbGFzcz1Nc29Cb2R5VGV4dCBzdHlsZT0nbWFyZ2luLWxlZnQ6MzYuMHB0O3RleHQtaW5kZW50Oi0xOC4wcHQnPjIuPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPC9zcGFuPjxpPldoaXRlLWJveDwvaT4KK3Rlc3QgY2FzZXMgYWltIHRvIG1heGltaXplIGNvZGUgY292ZXJhZ2UgdXNpbmcga25vd2xlZGdlIG9mIGNvZGUgaW50ZXJuYWxzLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+VGhlIGJsYWNrLWJveCB0ZXN0IGNhc2VzIGFyZSBkZXBlbmRlbnQgb24gYSBzcGVjaWZpY2FsbHkKK2Rlc2lnbmVkIHNldCBvZiBpbnB1dCBmaWxlcyBmb3VuZCBpbiB0aGUgPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQ7Citmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiLCJEZWphVnUgU2FucyBNb25vIic+Zm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC90ZXN0L3Jlczwvc3Bhbj4KK2RpcmVjdG9yeSBpbiB0aGUgcmVwb3NpdG9yeS4gRm9yIJF0ZXN0c5IgdmFyaWFudHMgb2YgdGhlIHNvZnR3YXJlLCB0aGVzZSBpbnB1dAorZmlsZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gaW1hZ2UgZHVyaW5nIGJ1aWxkLjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+UnVuIHRoZSB0ZXN0IGNhc2VzIGZyb20gdGhlIEFEQiBzaGVsbCBjb21tYW5kIGxpbmUgYXMKK2ZvbGxvd3M6PC9wPgorCis8cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi10b3A6MGNtO21hcmdpbi1yaWdodDowY207bWFyZ2luLWJvdHRvbTo2LjBwdDsKK21hcmdpbi1sZWZ0OjIxLjU1cHQnPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSIsIkRlamFWdSBTYW5zIE1vbm8iJz4jCitndGVzdF9md2Rsb2NrPC9zcGFuPjwvcD4KKworPHAgY2xhc3M9TXNvQm9keVRleHQ+SWYgYWxsIGJsYWNrLWJveCBidXQgbm8gd2hpdGUtYm94IHRlc3QgY2FzZXMgZmFpbCwgdGhlCitpbnB1dCBmaWxlcyBwcm9iYWJseSBjYW6SdCBiZSBmb3VuZCBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkuPC9wPgorCis8aDE+PGEgbmFtZT0iX1RvYzI3NjQ3MTQzNiI+NjxzcGFuIHN0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj5SZWZlcmVuY2VzPC9hPjwvaDE+CisKKzxwIGNsYXNzPU1zb0JvZHlUZXh0IHN0eWxlPSdtYXJnaW4tbGVmdDoyOC45cHQ7dGV4dC1pbmRlbnQ6LTI4LjlwdCc+WzFdPHNwYW4KK3N0eWxlPSdmb250OjcuMHB0ICJUaW1lcyBOZXcgUm9tYW4iJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKKzwvc3Bhbj48YQoraHJlZj0iaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL25pc3RwdWJzLzgwMC0zOGEvc3A4MDAtMzhhLnBkZiI+RHdvcmtpbiwKK01vcnJpczogk1JlY29tbWVuZGF0aW9uIGZvciBCbG9jayBDaXBoZXIgTW9kZXMgb2YgT3BlcmF0aW9ul01ldGhvZHMgYW5kCitUZWNobmlxdWVzLJQgTklTVCBTcGVjaWFsIFB1YmxpY2F0aW9uIDgwMC0zOEEsIERlY2VtYmVyIDIwMDEuPC9hPjxhCituYW1lPSJfUmVmMTUxMjY5MDczIj48L2E+PC9wPgorCis8L2Rpdj4KKworPC9ib2R5PgorCis8L2h0bWw+CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDEuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAxLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTJmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAyLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDMuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMDE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDAzLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTFkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODdiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA1LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZiBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9pbWFnZXMvaW1hZ2UwMDYuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDViNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvaW1hZ2VzL2ltYWdlMDA2LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5tayBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NTZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKKworTE9DQUxfTU9EVUxFIDo9IGxpYmRybXBhc3N0aHJ1cGx1Z2luCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliZHJtZnJhbWV3b3JrY29tbW9uCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYnV0aWxzCisKK2lmZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKyBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlCisKKyMgU2V0IHRoZSBmb2xsb3dpbmcgZmxhZyB0byBlbmFibGUgdGhlIGRlY3J5cHRpb24gcGFzc3RocnUgZmxvdworI0xPQ0FMX0NGTEFHUyArPSAtREVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiY2Q5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9QQVNTVEhSVV9QTFVHSU5fSF9fCisjZGVmaW5lIF9fRFJNX1BBU1NUSFJVX1BMVUdJTl9IX18KKworI2luY2x1ZGUgPERybUVuZ2luZUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1QYXNzdGhydVBsdWdJbiA6IHB1YmxpYyBEcm1FbmdpbmVCYXNlIHsKKworcHVibGljOgorICAgIERybVBhc3N0aHJ1UGx1Z0luKCk7CisgICAgdmlydHVhbCB+RHJtUGFzc3RocnVQbHVnSW4oKTsKKworcHJvdGVjdGVkOgorICAgIERybUNvbnN0cmFpbnRzKiBvbkdldENvbnN0cmFpbnRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICBEcm1NZXRhZGF0YSogb25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpOworCisgICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplKGludCB1bmlxdWVJZCk7CisKKyAgICBzdGF0dXNfdCBvblNldE9uSW5mb0xpc3RlbmVyKGludCB1bmlxdWVJZCwgY29uc3QgSURybUVuZ2luZTo6T25JbmZvTGlzdGVuZXIqIGluZm9MaXN0ZW5lcik7CisKKyAgICBzdGF0dXNfdCBvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpOworCisgICAgYm9vbCBvbkNhbkhhbmRsZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgRHJtSW5mb1N0YXR1cyogb25Qcm9jZXNzRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgc3RhdHVzX3Qgb25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCk7CisKKyAgICBEcm1JbmZvKiBvbkFjcXVpcmVEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KTsKKworICAgIFN0cmluZzggb25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICBpbnQgb25HZXREcm1PYmplY3RUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKKworICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisKKyAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbik7CisKKyAgICBib29sIG9uVmFsaWRhdGVBY3Rpb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKKyAgICBzdGF0dXNfdCBvblJlbW92ZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpOworCisgICAgc3RhdHVzX3Qgb25SZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IG9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ29udmVydERhdGEoaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkLCBjb25zdCBEcm1CdWZmZXIqIGlucHV0RGF0YSk7CisKKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIG9uQ2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGludCBjb252ZXJ0SWQpOworCisgICAgRHJtU3VwcG9ydEluZm8qIG9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKTsKKworICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CisKKyAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOworCisgICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKKworICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCk7CisKK3ByaXZhdGU6CisgICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uSW1wbCgpOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX1BBU1NUSFJVX1BMVUdJTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWUxZmRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEcm1QYXNzdGhydVBsdWdJbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRybS9Ecm1SaWdodHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mby5oPgorI2luY2x1ZGUgPGRybS9Ecm1JbmZvRXZlbnQuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1N0YXR1cy5oPgorI2luY2x1ZGUgPGRybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtSW5mb1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxkcm0vRHJtU3VwcG9ydEluZm8uaD4KKyNpbmNsdWRlIDxEcm1QYXNzdGhydVBsdWdJbi5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworCisvLyBUaGlzIGV4dGVybiAiQyIgaXMgbWFuZGF0b3J5IHRvIGJlIG1hbmFnZWQgYnkgVFBsdWdJbk1hbmFnZXIKK2V4dGVybiAiQyIgSURybUVuZ2luZSogY3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgRHJtUGFzc3RocnVQbHVnSW4oKTsKK30KKworLy8gVGhpcyBleHRlcm4gIkMiIGlzIG1hbmRhdG9yeSB0byBiZSBtYW5hZ2VkIGJ5IFRQbHVnSW5NYW5hZ2VyCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveShJRHJtRW5naW5lKiBwUGx1Z0luKSB7CisgICAgZGVsZXRlIHBQbHVnSW47CisgICAgcFBsdWdJbiA9IE5VTEw7Cit9CisKK0RybVBhc3N0aHJ1UGx1Z0luOjpEcm1QYXNzdGhydVBsdWdJbigpCisgICAgOiBEcm1FbmdpbmVCYXNlKCkgeworCit9CisKK0RybVBhc3N0aHJ1UGx1Z0luOjp+RHJtUGFzc3RocnVQbHVnSW4oKSB7CisKK30KKworRHJtTWV0YWRhdGEqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE1ldGFkYXRhKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCkgeworICAgIHJldHVybiBOVUxMOworfQorCitEcm1Db25zdHJhaW50cyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0Q29uc3RyYWludHMoCisgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCogcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldENvbnN0cmFpbnRzIEZyb20gUGF0aDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzID0gbmV3IERybUNvbnN0cmFpbnRzKCk7CisKKyAgICBTdHJpbmc4IHZhbHVlKCJkdW1teV9hdmFpbGFibGVfdGltZSIpOworICAgIGNoYXIqIGNoYXJWYWx1ZSA9IE5VTEw7CisgICAgY2hhclZhbHVlID0gbmV3IGNoYXJbdmFsdWUubGVuZ3RoKCkgKyAxXTsKKyAgICBzdHJuY3B5KGNoYXJWYWx1ZSwgdmFsdWUuc3RyaW5nKCksIHZhbHVlLmxlbmd0aCgpKTsKKworICAgIC8vSnVzdCBhZGQgZHVtbXkgYXZhaWxhYmxlIHRpbWUgZm9yIHZlcmlmaWNhdGlvbgorICAgIGRybUNvbnN0cmFpbnRzLT5wdXQoJihEcm1Db25zdHJhaW50czo6TElDRU5TRV9BVkFJTEFCTEVfVElNRSksIGNoYXJWYWx1ZSk7CisKKyAgICByZXR1cm4gZHJtQ29uc3RyYWludHM7Cit9CisKK0RybUluZm9TdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvKGludCB1bmlxdWVJZCwgY29uc3QgRHJtSW5mbyogZHJtSW5mbykgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByb2Nlc3NEcm1JbmZvIC0gRW50ZXIgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBEcm1JbmZvU3RhdHVzKiBkcm1JbmZvU3RhdHVzID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSBkcm1JbmZvKSB7CisgICAgICAgIHN3aXRjaCAoZHJtSW5mby0+Z2V0SW5mb1R5cGUoKSkgeworICAgICAgICBjYXNlIERybUluZm9SZXF1ZXN0OjpUWVBFX1JFR0lTVFJBVElPTl9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVtcHR5QnVmZmVyID0gbmV3IERybUJ1ZmZlcigpOworICAgICAgICAgICAgZHJtSW5mb1N0YXR1cyA9IG5ldyBEcm1JbmZvU3RhdHVzKERybUluZm9TdGF0dXM6OlNUQVRVU19PSywKKyAgICAgICAgICAgICAgICAgICAgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfUkVHSVNUUkFUSU9OX0lORk8sIGVtcHR5QnVmZmVyLCBkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfVU5SRUdJU1RSQVRJT05fSU5GTzogeworICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbXB0eUJ1ZmZlciA9IG5ldyBEcm1CdWZmZXIoKTsKKyAgICAgICAgICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cyhEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssCisgICAgICAgICAgICAgICAgICAgIERybUluZm9SZXF1ZXN0OjpUWVBFX1VOUkVHSVNUUkFUSU9OX0lORk8sIGVtcHR5QnVmZmVyLCBkcm1JbmZvLT5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRHJtSW5mb1JlcXVlc3Q6OlRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk86IHsKKyAgICAgICAgICAgIFN0cmluZzggbGljZW5zZVN0cmluZygiZHVtbXlfbGljZW5zZV9zdHJpbmciKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJTaXplID0gbGljZW5zZVN0cmluZy5zaXplKCk7CisgICAgICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCBsaWNlbnNlU3RyaW5nLnN0cmluZygpLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogYnVmZmVyID0gbmV3IERybUJ1ZmZlcihkYXRhLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIGRybUluZm9TdGF0dXMgPSBuZXcgRHJtSW5mb1N0YXR1cyhEcm1JbmZvU3RhdHVzOjpTVEFUVVNfT0ssCisgICAgICAgICAgICAgICAgICAgIERybUluZm9SZXF1ZXN0OjpUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9JTkZPLCBidWZmZXIsIGRybUluZm8tPmdldE1pbWVUeXBlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Qcm9jZXNzRHJtSW5mbyAtIEV4aXQiKTsKKyAgICByZXR1cm4gZHJtSW5mb1N0YXR1czsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0T25JbmZvTGlzdGVuZXIoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IElEcm1FbmdpbmU6Ok9uSW5mb0xpc3RlbmVyKiBpbmZvTGlzdGVuZXIpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRPbkluZm9MaXN0ZW5lciA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemUoaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZSA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblRlcm1pbmF0ZShpbnQgdW5pcXVlSWQpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25UZXJtaW5hdGUgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1TdXBwb3J0SW5mbyogRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0U3VwcG9ydEluZm8gOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBEcm1TdXBwb3J0SW5mbyogZHJtU3VwcG9ydEluZm8gPSBuZXcgRHJtU3VwcG9ydEluZm8oKTsKKyAgICAvLyBBZGQgbWltZXR5cGUncworICAgIGRybVN1cHBvcnRJbmZvLT5hZGRNaW1lVHlwZShTdHJpbmc4KCJhcHBsaWNhdGlvbi92bmQucGFzc3RocnUuZHJtIikpOworICAgIC8vIEFkZCBGaWxlIFN1ZmZpeGVzCisgICAgZHJtU3VwcG9ydEluZm8tPmFkZEZpbGVTdWZmaXgoU3RyaW5nOCgiLnBhc3N0aHJ1IikpOworICAgIC8vIEFkZCBwbHVnLWluIGRlc2NyaXB0aW9uCisgICAgZHJtU3VwcG9ydEluZm8tPnNldERlc2NyaXB0aW9uKFN0cmluZzgoIlBhc3N0aHJ1IHBsdWctaW4iKSk7CisgICAgcmV0dXJuIGRybVN1cHBvcnRJbmZvOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TYXZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgRHJtUmlnaHRzJiBkcm1SaWdodHMsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiByaWdodHNQYXRoLCBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNhdmVSaWdodHMgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitEcm1JbmZvKiBEcm1QYXNzdGhydVBsdWdJbjo6b25BY3F1aXJlRHJtSW5mbyhpbnQgdW5pcXVlSWQsIGNvbnN0IERybUluZm9SZXF1ZXN0KiBkcm1JbmZvUmVxdWVzdCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkFjcXVpcmVEcm1JbmZvIDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtSW5mbyogZHJtSW5mbyA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSBkcm1JbmZvUmVxdWVzdCkgeworICAgICAgICBTdHJpbmc4IGRhdGFTdHJpbmcoImR1bW15X2FjcXVpc3Rpb25fc3RyaW5nIik7CisgICAgICAgIGludCBsZW5ndGggPSBkYXRhU3RyaW5nLmxlbmd0aCgpOworICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIG1lbWNweShkYXRhLCBkYXRhU3RyaW5nLnN0cmluZygpLCBsZW5ndGgpOworICAgICAgICBkcm1JbmZvID0gbmV3IERybUluZm8oZHJtSW5mb1JlcXVlc3QtPmdldEluZm9UeXBlKCksCisgICAgICAgICAgICBEcm1CdWZmZXIoZGF0YSwgbGVuZ3RoKSwgZHJtSW5mb1JlcXVlc3QtPmdldE1pbWVUeXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gZHJtSW5mbzsKK30KKworYm9vbCBEcm1QYXNzdGhydVBsdWdJbjo6b25DYW5IYW5kbGUoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46OmNhbkhhbmRsZTogJXMgIiwgcGF0aC5zdHJpbmcoKSk7CisgICAgU3RyaW5nOCBleHRlbnNpb24gPSBwYXRoLmdldFBhdGhFeHRlbnNpb24oKTsKKyAgICBleHRlbnNpb24udG9Mb3dlcigpOworICAgIHJldHVybiAoU3RyaW5nOCgiLnBhc3N0aHJ1IikgPT0gZXh0ZW5zaW9uKTsKK30KKworU3RyaW5nOCBEcm1QYXNzdGhydVBsdWdJbjo6b25HZXRPcmlnaW5hbE1pbWVUeXBlKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkdldE9yaWdpbmFsTWltZVR5cGUoKSA6ICVkIiwgdW5pcXVlSWQpOworICAgIHJldHVybiBTdHJpbmc4KCJ2aWRlby9wYXNzdGhydSIpOworfQorCitpbnQgRHJtUGFzc3RocnVQbHVnSW46Om9uR2V0RHJtT2JqZWN0VHlwZSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25HZXREcm1PYmplY3RUeXBlKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRHJtT2JqZWN0VHlwZTo6VU5LTk9XTjsKK30KKworaW50IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNoZWNrUmlnaHRzU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBpbnQgcmlnaHRzU3RhdHVzID0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQ7CisgICAgcmV0dXJuIHJpZ2h0c1N0YXR1czsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db25zdW1lUmlnaHRzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitib29sIERybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblZhbGlkYXRlQWN0aW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUmVtb3ZlQWxsUmlnaHRzKGludCB1bmlxdWVJZCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblJlbW92ZUFsbFJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5Db252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworRHJtQ29udmVydGVkU3RhdHVzKiBEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGNvbnZlcnRJZCwgY29uc3QgRHJtQnVmZmVyKiBpbnB1dERhdGEpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Db252ZXJ0RGF0YSgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgRHJtQnVmZmVyKiBjb252ZXJ0ZWREYXRhID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IGlucHV0RGF0YSAmJiAwIDwgaW5wdXREYXRhLT5sZW5ndGgpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IGlucHV0RGF0YS0+bGVuZ3RoOworICAgICAgICBjaGFyKiBkYXRhID0gTlVMTDsKKyAgICAgICAgZGF0YSA9IG5ldyBjaGFyW2xlbmd0aF07CisgICAgICAgIGNvbnZlcnRlZERhdGEgPSBuZXcgRHJtQnVmZmVyKGRhdGEsIGxlbmd0aCk7CisgICAgICAgIG1lbWNweShjb252ZXJ0ZWREYXRhLT5kYXRhLCBpbnB1dERhdGEtPmRhdGEsIGxlbmd0aCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRHJtQ29udmVydGVkU3RhdHVzKERybUNvbnZlcnRlZFN0YXR1czo6U1RBVFVTX09LLCBjb252ZXJ0ZWREYXRhLCAwIC8qb2Zmc2V0Ki8pOworfQorCitEcm1Db252ZXJ0ZWRTdGF0dXMqIERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlQ29udmVydFNlc3Npb24oaW50IHVuaXF1ZUlkLCBpbnQgY29udmVydElkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VDb252ZXJ0U2Vzc2lvbigpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIG5ldyBEcm1Db252ZXJ0ZWRTdGF0dXMoRHJtQ29udmVydGVkU3RhdHVzOjpTVEFUVVNfT0ssIE5VTEwsIDAgLypvZmZzZXQqLyk7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKworI2lmZGVmIEVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCisgICAgZGVjcnlwdEhhbmRsZS0+bWltZVR5cGUgPSBTdHJpbmc4KCJ2aWRlby9wYXNzdGhydSIpOworICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlID0gRGVjcnlwdEFwaVR5cGU6OkVMRU1FTlRBUllfU1RSRUFNX0JBU0VEOworICAgIGRlY3J5cHRIYW5kbGUtPnN0YXR1cyA9IERSTV9OT19FUlJPUjsKKyAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKKyNlbmRpZgorCisgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKK30KKworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICBMT0dEKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CisgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gRFJNX05PX0VSUk9SOworfQorCitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgLyoqCisgICAgICogQXMgYSB3b3JrYXJvdW5kIGltcGxlbWVudGF0aW9uIHBhc3N0aHJ1IHdvdWxkIGNvcHkgdGhlIGdpdmVuCisgICAgICogZW5jcnlwdGVkIGJ1ZmZlciBhcyBpdCBpcyB0byBkZWNyeXB0ZWQgYnVmZmVyLiBOb3RlLCBkZWNCdWZmZXIKKyAgICAgKiBtZW1vcnkgaGFzIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLgorICAgICAqLworICAgIGlmIChOVUxMICE9ICgqZGVjQnVmZmVyKSAmJiAwIDwgKCpkZWNCdWZmZXIpLT5sZW5ndGgpIHsKKyAgICAgICAgbWVtY3B5KCgqZGVjQnVmZmVyKS0+ZGF0YSwgZW5jQnVmZmVyLT5kYXRhLCBlbmNCdWZmZXItPmxlbmd0aCk7CisgICAgICAgICgqZGVjQnVmZmVyKS0+bGVuZ3RoID0gZW5jQnVmZmVyLT5sZW5ndGg7CisgICAgfQorICAgIHJldHVybiBEUk1fTk9fRVJST1I7Cit9CisKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CisgICAgTE9HRCgiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CisgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKK30KKworc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZl90IG9mZnNldCkgeworICAgIExPR0QoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtQ29uc3RyYWludHMuaCBiL2luY2x1ZGUvZHJtL0RybUNvbnN0cmFpbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllYzk0MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUNvbnN0cmFpbnRzLmgKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0NPTlNUUkFJTlRTX0hfXworI2RlZmluZSBfX0RSTV9DT05TVFJBSU5UU19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0cmFpbnRzIGluZm9ybWF0aW9uLgorICoKKyAqIEFzIGEgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OmdldENvbnN0cmFpbnRzKGNvbnN0IFN0cmluZzgqLCBjb25zdCBpbnQpCisgKiBhbiBpbnN0YW5jZSBvZiBEcm1Db25zdHJhaW50cyB3b3VsZCBiZSByZXR1cm5lZC4KKyAqCisgKi8KK2NsYXNzIERybUNvbnN0cmFpbnRzIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgcmVwbGljYSBvZiBhbmRyb2lkLmRybS5Ecm1TdG9yZS5Db25zdHJhaW50c0NvbHVtbnMKKyAgICAgKiBBbnkgY2hhbmdlcyBzaG91bGQgYWxzbyBiZSBpbmNvcnBvcmF0ZWQgd2l0aCBKYXZhIExheWVyIGFzIHdlbGwKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBUaGUgbWF4IHJlcGVhdCBjb3VudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IE1BWF9SRVBFQVRfQ09VTlQ7CisgICAgLyoqCisgICAgICogVGhlIHJlbWFpbmluZyByZXBlYXQgY291bnQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBSRU1BSU5JTkdfUkVQRUFUX0NPVU5UOworCisgICAgLyoqCisgICAgICogVGhlIHRpbWUgYmVmb3JlIHdoaWNoIHRoZSBwcm90ZWN0ZWQgZmlsZSBjYW4gbm90IGJlIHBsYXllZC92aWV3ZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBMSUNFTlNFX1NUQVJUX1RJTUU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBhZnRlciB3aGljaCB0aGUgcHJvdGVjdGVkIGZpbGUgY2FuIG5vdCBiZSBwbGF5ZWQvdmlld2VkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggTElDRU5TRV9FWFBJUllfVElNRTsKKworICAgIC8qKgorICAgICAqIFRoZSBhdmFpbGFibGUgdGltZSBmb3IgbGljZW5zZQorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IExJQ0VOU0VfQVZBSUxBQkxFX1RJTUU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGF0YSBzdHJlYW0gZm9yIGV4dGVuZGVkIG1ldGFkYXRhCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRVhURU5ERURfTUVUQURBVEE7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtQ29uc3RyYWludHM7CisgICAgcHJpdmF0ZToKKyAgICAgICAgS2V5SXRlcmF0b3IoRHJtQ29uc3RyYWludHMqIGRybUNvbnN0cmFpbnRzKQorICAgICAgICAgICAgOiBtRHJtQ29uc3RyYWludHMoZHJtQ29uc3RyYWludHMpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgS2V5SXRlcmF0b3IoY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgS2V5SXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5LZXlJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1Db25zdHJhaW50cyogbURybUNvbnN0cmFpbnRzOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3IgY29uc3RyYWludHMKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1Db25zdHJhaW50czsKKyAgICBwcml2YXRlOgorICAgICAgICBJdGVyYXRvcihEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMpCisgICAgICAgICAgICA6IG1Ecm1Db25zdHJhaW50cyhkcm1Db25zdHJhaW50cyksIG1JbmRleCgwKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcihjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIHZpcnR1YWwgfkl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIFN0cmluZzggbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtQ29uc3RyYWludHMqIG1Ecm1Db25zdHJhaW50czsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCitwdWJsaWM6CisgICAgRHJtQ29uc3RyYWludHMoKSB7fQorICAgIHZpcnR1YWwgfkRybUNvbnN0cmFpbnRzKCkgeworICAgICAgICBEcm1Db25zdHJhaW50czo6S2V5SXRlcmF0b3Iga2V5SXQgPSB0aGlzLT5rZXlJdGVyYXRvcigpOworCisgICAgICAgIHdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZzgga2V5ID0ga2V5SXQubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gdGhpcy0+Z2V0QXNCeXRlQXJyYXkoJmtleSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNvbnN0cmFpbnRNYXAuY2xlYXIoKTsKKyAgICB9CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbnN0cmFpbnRzIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBjb25zdHJhaW50cworICAgICAqLworICAgIGludCBnZXRDb3VudCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFkZHMgY29uc3RyYWludCBpbmZvcm1hdGlvbiBhcyA8a2V5LCB2YWx1ZT4gcGFpciB0byB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGtleSBLZXkgdG8gYWRkCisgICAgICogQHBhcmFtW2luXSB2YWx1ZSBWYWx1ZSB0byBhZGQKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHB1dChjb25zdCBTdHJpbmc4KiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZQorICAgICAqLworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisKKyAgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBhcyBieXRlIGFycmF5IG9mIGdpdmVuIGtleQorICAgICAqIEBwYXJhbSBrZXkgS2V5IHdob3NlIHZhbHVlIHRvIGJlIHJldHJpZXZlZCBhcyBieXRlIGFycmF5CisgICAgICogQHJldHVybiBUaGUgYnl0ZSBhcnJheSB2YWx1ZQorICAgICAqLworICAgIGNvbnN0IGNoYXIqIGdldEFzQnl0ZUFycmF5KGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEtleUl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gS2V5SXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Citwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIGdldFZhbHVlKGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3Q7Citwcml2YXRlOgorICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgY29uc3QgY2hhcio+IERybUNvbnN0cmFpbnRzTWFwOworICAgIERybUNvbnN0cmFpbnRzTWFwIG1Db25zdHJhaW50TWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0NPTlNUUkFJTlRTX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaCBiL2luY2x1ZGUvZHJtL0RybUNvbnZlcnRlZFN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWU0OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1Db252ZXJ0ZWRTdGF0dXMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9DT05WRVJURURfU1RBVFVTX0hfXworI2RlZmluZSBfX0RSTV9DT05WRVJURURfU1RBVFVTX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB3aGljaCB3cmFwcyB0aGUgc3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uLCB0aGUgY29udmVydGVkCisgKiBkYXRhL2NoZWNrc3VtIGRhdGEgYW5kIHRoZSBvZmZzZXQuIE9mZnNldCBpcyBnb2luZyB0byBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGNsb3NlCisgKiBzZXNzaW9uIHdoZXJlIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB3aGVyZSB0aGUgaGVhZGVyIGFuZCBib2R5IHNpZ25hdHVyZSBzaG91bGQgYmUgYWRkZWQKKyAqCisgKiBBcyBhIHJlc3VsdCBvZiBEcm1NYW5hZ2VyQ2xpZW50Ojpjb252ZXJ0RGF0YShpbnQsIGNvbnN0IERybUJ1ZmZlciopIGFuZAorICogRHJtTWFuYWdlckNsaWVudDo6Y2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQpIGFuIGluc3RhbmNlIG9mIERybUNvbnZlcnRlZFN0YXR1cworICogd291bGQgYmUgcmV0dXJuZWQuCisgKgorICovCitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXMgeworcHVibGljOgorICAgIC8vIFNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtQ29udmVydGVkU3RhdHVzLmphdmEKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19PSyA9IDE7CisgICAgc3RhdGljIGNvbnN0IGludCBTVEFUVVNfSU5QVVREQVRBX0VSUk9SID0gMjsKKyAgICBzdGF0aWMgY29uc3QgaW50IFNUQVRVU19FUlJPUiA9IDM7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtQ29udmVydGVkU3RhdHVzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIF9zdGF0dXNDb2RlIFN0YXR1cyBvZiB0aGUgY29udmVyc2lvbgorICAgICAqIEBwYXJhbVtpbl0gX2NvbnZlcnRlZERhdGEgQ29udmVydGVkIGRhdGEvY2hlY2tzdW0gZGF0YQorICAgICAqIEBwYXJhbVtpbl0gX29mZnNldCBPZmZzZXQgdmFsdWUKKyAgICAgKi8KKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMoaW50IF9zdGF0dXNDb2RlLCBjb25zdCBEcm1CdWZmZXIqIF9jb252ZXJ0ZWREYXRhLCBpbnQgX29mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBEZXN0cnVjdG9yIGZvciBEcm1Db252ZXJ0ZWRTdGF0dXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1Db252ZXJ0ZWRTdGF0dXMoKSB7CisKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgc3RhdHVzQ29kZTsKKyAgICBjb25zdCBEcm1CdWZmZXIqIGNvbnZlcnRlZERhdGE7CisgICAgaW50IG9mZnNldDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9DT05WRVJURURfU1RBVFVTX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1JbmZvLmggYi9pbmNsdWRlL2RybS9Ecm1JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0ODU0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUluZm8uaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fSU5GT19IX18KKyNkZWZpbmUgX19EUk1fSU5GT19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3MgaW4gd2hpY2ggbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHRyYW5zYWN0CisgKiBiZXR3ZWVuIGRldmljZSBhbmQgb25saW5lIERSTSBzZXJ2ZXIgaXMgZGVzY3JpYmVkLiBEUk0gRnJhbWV3b3JrIGFjaGlldmVzCisgKiBzZXJ2ZXIgcmVnaXN0cmF0aW9uLCBsaWNlbnNlIGFjcXVpc2l0aW9uIGFuZCBhbnkgb3RoZXIgc2VydmVyIHJlbGF0ZWQgdHJhbnNhY3Rpb24KKyAqIGJ5IHBhc3NpbmcgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0byBEcm1NYW5hZ2VyQ2xpZW50Ojpwcm9jZXNzRHJtSW5mbyhjb25zdCBEcm1JbmZvKikuCisgKgorICogVGhlIENhbGxlciBjYW4gcmV0cmlldmUgdGhlIERybUluZm8gaW5zdGFuY2UgYnkgdXNpbmcKKyAqIERybU1hbmFnZXJDbGllbnQ6OmFjcXVpcmVEcm1JbmZvKGNvbnN0IERybUluZm9SZXF1ZXN0KikgYnkgcGFzc2luZyBEcm1JbmZvUmVxdWVzdCBpbnN0YW5jZS4KKyAqCisgKi8KK2NsYXNzIERybUluZm8geworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1JbmZvCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIGRybUJ1ZmZlciBUcmlnZ2VyIGRhdGEKKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIERybUluZm8oaW50IGluZm9UeXBlLCBjb25zdCBEcm1CdWZmZXImIGRybUJ1ZmZlciwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mbworICAgICAqLworICAgIHZpcnR1YWwgfkRybUluZm8oKSB7fQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIGtleQorICAgICAqLworICAgIGNsYXNzIEtleUl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybUluZm87CisKKyAgICBwcml2YXRlOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBEcm1JbmZvKiBkcm1JbmZvKQorICAgICAgICAgICAgOiBtRHJtSW5mbyhjb25zdF9jYXN0IDxEcm1JbmZvKj4gKGRybUluZm8pKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEtleUl0ZXJhdG9yKGNvbnN0IEtleUl0ZXJhdG9yJiBrZXlJdGVyYXRvcik7CisgICAgICAgIEtleUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+S2V5SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtSW5mbyogbURybUluZm87CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yCisgICAgICovCisgICAgY2xhc3MgSXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mbzsKKworICAgIHByaXZhdGU6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IERybUluZm8qIGRybUluZm8pCisgICAgICAgICAgICA6IG1Ecm1JbmZvKGNvbnN0X2Nhc3QgPERybUluZm8qPiAoZHJtSW5mbykpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgSXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvKiBtRHJtSW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIHR5cGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0SW5mb1R5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE1JTUUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldE1pbWVUeXBlKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHJpZ2dlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRyaWdnZXIgZGF0YQorICAgICAqLworICAgIGNvbnN0IERybUJ1ZmZlciYgZ2V0RGF0YSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBhdHRyaWJ1dGVzCisgICAgICovCisgICAgaW50IGdldENvdW50KHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQWRkcyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhcyA8a2V5LCB2YWx1ZT4gcGFpciB0byB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGtleSBLZXkgdG8gYWRkCisgICAgICogQHBhcmFtW2luXSB2YWx1ZSBWYWx1ZSB0byBhZGQKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGVycm9yIGNvZGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwdXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGdpdmVuIGtleQorICAgICAqCisgICAgICogQHBhcmFtIGtleSBLZXkgd2hvc2UgdmFsdWUgdG8gYmUgcmV0cmlldmVkCisgICAgICogQHJldHVybiBUaGUgdmFsdWUKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBLZXlJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIHRoZSBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEtleUl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEtleUl0ZXJhdG9yIGtleUl0ZXJhdG9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBJdGVyYXRvciBpdGVyYXRvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmRleCBvZiB0aGUgZ2l2ZW4ga2V5CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluZGV4CisgICAgICovCisgICAgaW50IGluZGV4T2ZLZXkoY29uc3QgU3RyaW5nOCYga2V5KSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGludCBtSW5mb1R5cGU7CisgICAgRHJtQnVmZmVyIG1EYXRhOworICAgIFN0cmluZzggbU1pbWVUeXBlOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1BdHRyaWJ1dGVzOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX0lORk9fSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUluZm9FdmVudC5oIGIvaW5jbHVkZS9kcm0vRHJtSW5mb0V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MDlmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUluZm9FdmVudC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9JTkZPX0VWRU5UX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX0VWRU5UX0hfXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKKy8qKgorICogVGhpcyBpcyBhbiBlbnRpdHkgY2xhc3Mgd2hpY2ggd291bGQgYmUgcGFzc2VkIHRvIGNhbGxlciBpbgorICogRHJtTWFuYWdlckNsaWVudDo6T25JbmZvTGlzdGVuZXI6Om9uSW5mbyhjb25zdCBEcm1JbmZvRXZlbnQmKS4KKyAqLworY2xhc3MgRHJtSW5mb0V2ZW50IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IHZhbHVlcyBzaG91bGQgYmUgaW4gc3luYyB3aXRoIERybUluZm9FdmVudC5qYXZhCisgICAgICovCisgICAgLy8hIFRZUEVfQUxSRUFEWV9SRUdJU1RFUkVEX0JZX0FOT1RIRVJfQUNDT1VOVCwgd2hlbiByZWdpc3RyYXRpb24gaGFzIGJlZW4KKyAgICAvLyEgYWxyZWFkeSBkb25lIGJ5IGFub3RoZXIgYWNjb3VudCBJRC4KKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQUxSRUFEWV9SRUdJU1RFUkVEX0JZX0FOT1RIRVJfQUNDT1VOVCA9IDE7CisgICAgLy8hIFRZUEVfUkVNT1ZFX1JJR0hUUywgd2hlbiB0aGUgcmlnaHRzIG5lZWRzIHRvIGJlIHJlbW92ZWQgY29tcGxldGVseS4KKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUkVNT1ZFX1JJR0hUUyA9IDI7CisgICAgLy8hIFRZUEVfUklHSFRTX0lOU1RBTExFRCwgd2hlbiB0aGUgcmlnaHRzIGFyZSBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQgb2suCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19JTlNUQUxMRUQgPSAzOworICAgIC8vISBUWVBFX1dBSVRfRk9SX1JJR0hUUywgcmlnaHRzIG9iamVjdCBpcyBvbiBpdCdzIHdheSB0byBwaG9uZSwKKyAgICAvLyEgd2FpdCBiZWZvcmUgY2FsbGluZyBjaGVja1JpZ2h0cyBhZ2FpbgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9XQUlUX0ZPUl9SSUdIVFMgPSA0OworICAgIC8vISBUWVBFX0FDQ09VTlRfQUxSRUFEWV9SRUdJU1RFUkVELCB3aGVuIHJlZ2lzdHJhdGlvbiBoYXMgYmVlbgorICAgIC8vISBhbHJlYWR5IGRvbmUgZm9yIHRoZSBnaXZlbiBhY2NvdW50LgorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9BQ0NPVU5UX0FMUkVBRFlfUkVHSVNURVJFRCA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50IHZhbHVlcyBzaG91bGQgYmUgaW4gc3luYyB3aXRoIERybUVycm9yRXZlbnQuamF2YQorICAgICAqLworICAgIC8vISBUWVBFX1JJR0hUU19OT1RfSU5TVEFMTEVELCB3aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nIGluc3RhbGxpbmcgdGhlIHJpZ2h0cworICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9SSUdIVFNfTk9UX0lOU1RBTExFRCA9IDIwMDE7CisgICAgLy8hIFRZUEVfUklHSFRTX1JFTkVXQUxfTk9UX0FMTE9XRUQsIHdoZW4gdGhlIHNlcnZlciByZWplY3RzIHJlbmV3YWwgb2YgcmlnaHRzCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19SRU5FV0FMX05PVF9BTExPV0VEID0gMjAwMjsKKyAgICAvLyEgVFlQRV9OT1RfU1VQUE9SVEVELCB3aGVuIGFuc3dlciBmcm9tIHNlcnZlciBjYW4gbm90IGJlIGhhbmRsZWQgYnkgdGhlIG5hdGl2ZSBhZ2VudAorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9OT1RfU1VQUE9SVEVEID0gMjAwMzsKKyAgICAvLyEgVFlQRV9PVVRfT0ZfTUVNT1JZLCB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWwgZHVyaW5nIHJlbmV3YWwuCisgICAgLy8hIENhbiBpbiB0aGUgZnV0dXJlIHBlcmhhcHMgYmUgdXNlZCB0byB0cmlnZ2VyIGdhcmJhZ2UgY29sbGVjdG9yCisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX09VVF9PRl9NRU1PUlkgPSAyMDA0OworICAgIC8vISBUWVBFX05PX0lOVEVSTkVUX0NPTk5FQ1RJT04sIHdoZW4gdGhlIEludGVybmV0IGNvbm5lY3Rpb24gaXMgbWlzc2luZyBhbmQgbm8gYXR0ZW1wdAorICAgIC8vISBjYW4gYmUgbWFkZSB0byByZW5ldyByaWdodHMKKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTk9fSU5URVJORVRfQ09OTkVDVElPTiA9IDIwMDU7CisgICAgLy8hIFRZUEVfUFJPQ0VTU19EUk1fSU5GT19GQUlMRUQsIHdoZW4gZmFpbGVkIHRvIHByb2Nlc3MgRHJtSW5mby4KKyAgICBzdGF0aWMgY29uc3QgaW50IFRZUEVfUFJPQ0VTU19EUk1fSU5GT19GQUlMRUQgPSAyMDA2OworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm9FdmVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgc2Vzc2lvbiBpZGVudGlmaWVyCisgICAgICogQHBhcmFtW2luXSBpbmZvVHlwZSBUeXBlIG9mIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtW2luXSBtZXNzYWdlIE1lc3NhZ2UgZGVzY3JpcHRpb24KKyAgICAgKi8KKyAgICBEcm1JbmZvRXZlbnQoaW50IHVuaXF1ZUlkLCBpbnQgaW5mb1R5cGUsIGNvbnN0IFN0cmluZzgmIG1lc3NhZ2UpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mb0V2ZW50CisgICAgICovCisgICAgdmlydHVhbCB+RHJtSW5mb0V2ZW50KCkge30KKworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFVuaXF1ZSBJZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBVbmlxdWUgSWQKKyAgICAgKi8KKyAgICBpbnQgZ2V0VW5pcXVlSWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFR5cGUgb2YgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBpbnQgZ2V0VHlwZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gTWVzc2FnZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIGNvbnN0IFN0cmluZzgmIGdldE1lc3NhZ2UoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBpbnQgbVVuaXF1ZUlkOworICAgIGludCBtSW5mb1R5cGU7CisgICAgY29uc3QgU3RyaW5nOCYgbU1lc3NhZ2U7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU5GT19FVkVOVF9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtSW5mb1JlcXVlc3QuaCBiL2luY2x1ZGUvZHJtL0RybUluZm9SZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0OGVjYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHJtL0RybUluZm9SZXF1ZXN0LmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lORk9fUkVRVUVTVF9IX18KKyNkZWZpbmUgX19EUk1fSU5GT19SRVFVRVNUX0hfXworCisjaW5jbHVkZSAiZHJtX2ZyYW1ld29ya19jb21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB1c2VkIHRvIHBhc3MgcmVxdWlyZWQgcGFyYW1ldGVycyB0byBnZXQKKyAqIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gY29tbXVuaWNhdGUgd2l0aCBvbmxpbmUgRFJNIHNlcnZlcgorICoKKyAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgcGFzc2VkIHRvCisgKiBEcm1NYW5hZ2VyQ2xpZW50OjphY3F1aXJlRHJtSW5mbyhjb25zdCBEcm1JbmZvUmVxdWVzdCopIHRvIGdldCB0aGUKKyAqIGluc3RhbmNlIG9mIERybUluZm8uCisgKgorICovCitjbGFzcyBEcm1JbmZvUmVxdWVzdCB7CitwdWJsaWM6CisgICAgLy8gQ2hhbmdlcyBpbiBmb2xsb3dpbmcgY29uc3RhbnRzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb1JlcXVlc3QuamF2YQorICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9SRUdJU1RSQVRJT05fSU5GTyA9IDE7CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1VOUkVHSVNUUkFUSU9OX0lORk8gPSAyOworICAgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9SSUdIVFNfQUNRVUlTSVRJT05fSU5GTyA9IDM7CisgICAgc3RhdGljIGNvbnN0IGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9QUk9HUkVTU19JTkZPID0gNDsKKworICAgIC8qKgorICAgICAqIEtleSB0byBwYXNzIHRoZSB1bmlxdWUgaWQgZm9yIHRoZSBhY2NvdW50IG9yIHRoZSB1c2VyCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggQUNDT1VOVF9JRDsKKyAgICAvKioKKyAgICAgKiBLZXkgdG8gcGFzcyB0aGUgc3Vic2NyaXB0aW9uIGlkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggU1VCU0NSSVBUSU9OX0lEOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybUluZm9SZXF1ZXN0CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGluZm9UeXBlIFR5cGUgb2YgaW5mb3JtYXRpb24KKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqLworICAgIERybUluZm9SZXF1ZXN0KGludCBpbmZvVHlwZSwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtSW5mb1JlcXVlc3QKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1JbmZvUmVxdWVzdCgpIHt9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3Iga2V5CisgICAgICovCisgICAgY2xhc3MgS2V5SXRlcmF0b3IgeworICAgICAgICBmcmllbmQgY2xhc3MgRHJtSW5mb1JlcXVlc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBLZXlJdGVyYXRvcihjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpCisgICAgICAgICAgICA6IG1Ecm1JbmZvUmVxdWVzdChjb25zdF9jYXN0IDxEcm1JbmZvUmVxdWVzdCo+IChkcm1JbmZvUmVxdWVzdCkpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgS2V5SXRlcmF0b3IoY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgS2V5SXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5LZXlJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1JbmZvUmVxdWVzdCogbURybUluZm9SZXF1ZXN0OworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvcgorICAgICAqLworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybUluZm9SZXF1ZXN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSXRlcmF0b3IoY29uc3QgRHJtSW5mb1JlcXVlc3QqIGRybUluZm9SZXF1ZXN0KQorICAgICAgICAgICAgOiBtRHJtSW5mb1JlcXVlc3QoY29uc3RfY2FzdCA8RHJtSW5mb1JlcXVlc3QqPiAoZHJtSW5mb1JlcXVlc3QpKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtSW5mb1JlcXVlc3QqIG1Ecm1JbmZvUmVxdWVzdDsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIHR5cGUKKyAgICAgKi8KKyAgICBpbnQgZ2V0SW5mb1R5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE1JTUUgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBNSU1FIHR5cGUKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldE1pbWVUeXBlKHZvaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gRHJtUmVxdWVzdEluZm9NYXAKKyAgICAgKgorICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgKi8KKyAgICBpbnQgZ2V0Q291bnQodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFzIDxrZXksIHZhbHVlPiBwYWlyIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0ga2V5IEtleSB0byBhZGQKKyAgICAgKiBAcGFyYW1baW5dIHZhbHVlIFZhbHVlIHRvIGFkZAorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZXJyb3IgY29kZQorICAgICAqLworICAgIHN0YXR1c190IHB1dChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgZ2l2ZW4ga2V5CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IEtleSB3aG9zZSB2YWx1ZSB0byBiZSByZXRyaWV2ZWQKKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZQorICAgICAqLworICAgIFN0cmluZzggZ2V0KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEtleUl0ZXJhdG9yIG9iamVjdCB0byB3YWxrIHRocm91Z2ggdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gS2V5SXRlcmF0b3Igb2JqZWN0CisgICAgICovCisgICAgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgaW50IG1JbmZvVHlwZTsKKyAgICBTdHJpbmc4IG1NaW1lVHlwZTsKKworICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gRHJtUmVxdWVzdEluZm9NYXA7CisgICAgRHJtUmVxdWVzdEluZm9NYXAgbVJlcXVlc3RJbmZvcm1hdGlvbk1hcDsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9JTkZPX1JFUVVFU1RfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybUluZm9TdGF0dXMuaCBiL2luY2x1ZGUvZHJtL0RybUluZm9TdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMwZjQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtSW5mb1N0YXR1cy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRFJNX0lORk9fU1RBVFVTX0hfXworI2RlZmluZSBfX0RSTV9JTkZPX1NUQVRVU19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIHJlc3VsdCBvZiBjb21tdW5pY2F0aW9uIGJldHdlZW4gZGV2aWNlCisgKiBhbmQgb25saW5lIERSTSBzZXJ2ZXIuCisgKgorICogQXMgYSByZXN1bHQgb2YgRHJtTWFuYWdlckNsaWVudDo6cHJvY2Vzc0RybUluZm8oY29uc3QgRHJtSW5mbyopIGFuIGluc3RhbmNlIG9mCisgKiBEcm1JbmZvU3RhdHVzIHdvdWxkIGJlIHJldHVybmVkLiBUaGlzIGNsYXNzIGhvbGRzIERybUJ1ZmZlciB3aGljaCBjb3VsZCBiZQorICogdXNlZCB0byBpbnN0YW50aWF0ZSBEcm1SaWdodHMgaW4gbGljZW5zZSBhY3F1aXNpdGlvbi4KKyAqCisgKi8KK2NsYXNzIERybUluZm9TdGF0dXMgeworcHVibGljOgorICAgIC8vIFNob3VsZCBiZSBpbiBzeW5jIHdpdGggRHJtSW5mb1N0YXR1cy5qYXZhCisgICAgc3RhdGljIGNvbnN0IGludCBTVEFUVVNfT0sgPSAxOworICAgIHN0YXRpYyBjb25zdCBpbnQgU1RBVFVTX0VSUk9SID0gMjsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciBEcm1JbmZvU3RhdHVzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIF9zdGF0dXNDb2RlIFN0YXR1cyBvZiB0aGUgY29tbXVuaWNhdGlvbgorICAgICAqIEBwYXJhbVtpbl0gX2luZm9UeXBlIFR5cGUgb2YgdGhlIERSTSBpbmZvcm1hdGlvbiBwcm9jZXNzZWQKKyAgICAgKiBAcGFyYW1baW5dIF9kcm1CdWZmZXIgUmlnaHRzIGluZm9ybWF0aW9uCisgICAgICogQHBhcmFtW2luXSBfbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICovCisgICAgRHJtSW5mb1N0YXR1cyhpbnQgX3N0YXR1c0NvZGUsIGludCBfaW5mb1R5cGUsIGNvbnN0IERybUJ1ZmZlciogX2RybUJ1ZmZlciwgY29uc3QgU3RyaW5nOCYgX21pbWVUeXBlKTsKKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIERybUluZm9TdGF0dXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5Ecm1JbmZvU3RhdHVzKCkgeworCisgICAgfQorCitwdWJsaWM6CisgICAgaW50IHN0YXR1c0NvZGU7CisgICAgaW50IGluZm9UeXBlOworICAgIGNvbnN0IERybUJ1ZmZlciogZHJtQnVmZmVyOworICAgIFN0cmluZzggbWltZVR5cGU7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fSU5GT19TVEFUVVNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ1NTZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9NQU5BR0VSX0NMSUVOVF9IX18KKyNkZWZpbmUgX19EUk1fTUFOQUdFUl9DTElFTlRfSF9fCisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERybUluZm87CitjbGFzcyBEcm1SaWdodHM7CitjbGFzcyBEcm1NZXRhZGF0YTsKK2NsYXNzIERybUluZm9FdmVudDsKK2NsYXNzIERybUluZm9TdGF0dXM7CitjbGFzcyBEcm1JbmZvUmVxdWVzdDsKK2NsYXNzIERybVN1cHBvcnRJbmZvOworY2xhc3MgRHJtQ29uc3RyYWludHM7CitjbGFzcyBEcm1Db252ZXJ0ZWRTdGF0dXM7CitjbGFzcyBEcm1NYW5hZ2VyQ2xpZW50SW1wbDsKKworLyoqCisgKiBUaGUgTmF0aXZlIGFwcGxpY2F0aW9uIHdpbGwgaW5zdGFudGlhdGUgdGhpcyBjbGFzcyBhbmQgYWNjZXNzIERSTSBGcmFtZXdvcmsKKyAqIHNlcnZpY2VzIHRocm91Z2ggdGhpcyBjbGFzcy4KKyAqCisgKi8KK2NsYXNzIERybU1hbmFnZXJDbGllbnQgeworcHVibGljOgorICAgIERybU1hbmFnZXJDbGllbnQoKTsKKworICAgIHZpcnR1YWwgfkRybU1hbmFnZXJDbGllbnQoKTsKKworcHVibGljOgorICAgIGNsYXNzIE9uSW5mb0xpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlIHsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+T25JbmZvTGlzdGVuZXIoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpID0gMDsKKyAgICB9OworCisvKioKKyAqIEFQSXMgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IG5hdGl2ZSBtb2R1bGVzIChlLmcuIFN0YWdlRnJpZ2h0KQorICoKKyAqLworcHVibGljOgorICAgIC8qKgorICAgICAqIE9wZW4gdGhlIGRlY3J5cHQgc2Vzc2lvbiB0byBkZWNyeXB0IHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBmZCBGaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb3RlY3RlZCBjb250ZW50IHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEBwYXJhbVtpbl0gb2Zmc2V0IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBjb250ZW50CisgICAgICogQHBhcmFtW2luXSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqLworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgZGVjcnlwdCBzZXNzaW9uIHRvIGRlY3J5cHQgdGhlIGdpdmVuIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVyaSBQYXRoIG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudCB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqLworICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihjb25zdCBjaGFyKiB1cmkpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGRlY3J5cHQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGhhbmRsZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIHRoZSByaWdodHMgZm9yIGEgY29udGVudC4KKyAgICAgKiBJZiB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmlnaHRzIGlzIHJlc2VydmVkIHVudGlsIHRoZSBzYW1lCisgICAgICogYXBwbGljYXRpb24gY2FsbHMgdGhpcyBhcGkgYWdhaW4gd2l0aCB0aGUgcmVzZXJ2ZSBwYXJhbWV0ZXIgc2V0IHRvIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gYWN0aW9uIEFjdGlvbiB0byBwZXJmb3JtLiAoQWN0aW9uOjpERUZBVUxULCBBY3Rpb246OlBMQVksIGV0YykKKyAgICAgKiBAcGFyYW1baW5dIHJlc2VydmUgVHJ1ZSBpZiB0aGUgcmlnaHRzIHNob3VsZCBiZSByZXNlcnZlZC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZS4KKyAgICAgKiAgICAgSW4gY2FzZSBsaWNlbnNlIGhhcyBiZWVuIGV4cGlyZWQsIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1zIHRoZSBEUk0gZW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gcGxheWJhY2tTdGF0dXMgUGxheWJhY2sgYWN0aW9uIChQbGF5YmFjazo6U1RBUlQsIFBsYXliYWNrOjpTVE9QLCBQbGF5YmFjazo6UEFVU0UpCisgICAgICogQHBhcmFtW2luXSBwb3NpdGlvbiBQb3NpdGlvbiBpbiB0aGUgZmlsZSAoaW4gbWlsbGlzZWNvbmRzKSB3aGVyZSB0aGUgc3RhcnQgb2NjdXJzLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgT25seSB2YWxpZCB0b2dldGhlciB3aXRoIFBsYXliYWNrOjpTVEFSVC4KKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcGFyYW1baW5dIGhlYWRlckluZm8gSW5mb3JtYXRpb24gZm9yIGluaXRpYWxpemluZyBkZWNyeXB0aW9uIG9mIHRoaXMgZGVjcnlwVW5pdAorICAgICAqIEByZXR1cm4gc3RhdHVzX3QKKyAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBEZWNyeXB0IHRoZSBwcm90ZWN0ZWQgY29udGVudCBidWZmZXJzIGZvciB0aGUgZ2l2ZW4gdW5pdAorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGJhc2VkIG9uIG51bWJlciBvZgorICAgICAqIGVuY3J5cHRlZCBzdHJlYW1zIHJlY2VpdmVkIGZyb20gYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlY3J5cHRIYW5kbGUgSGFuZGxlIGZvciB0aGUgZGVjcnlwdGlvbiBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0VW5pdElkIElEIHdoaWNoIHNwZWNpZmllcyBkZWNyeXB0aW9uIHVuaXQsIHN1Y2ggYXMgdHJhY2sgSUQKKyAgICAgKiBAcGFyYW1baW5dIGVuY0J1ZmZlciBFbmNyeXB0ZWQgZGF0YSBibG9jaworICAgICAqIEBwYXJhbVtvdXRdIGRlY0J1ZmZlciBEZWNyeXB0ZWQgZGF0YSBibG9jaworICAgICAqIEBwYXJhbVtpbl0gSVYgT3B0aW9uYWwgYnVmZmVyCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGZvciB0aGlzIEFQSQorICAgICAqICAgICBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIGFuZCBvbmUgb2YgRFJNX0VSUk9SX1VOS05PV04sIERSTV9FUlJPUl9MSUNFTlNFX0VYUElSRUQKKyAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCisgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgorICAgICAqLworICAgIHN0YXR1c190IGRlY3J5cHQoCisgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYgPSBOVUxMKTsKKworICAgIC8qKgorICAgICAqIEZpbmFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZWNyeXB0SGFuZGxlIEhhbmRsZSBmb3IgdGhlIGRlY3J5cHRpb24gc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdFVuaXRJZCBJRCB3aGljaCBzcGVjaWZpZXMgZGVjcnlwdGlvbiB1bml0LCBzdWNoIGFzIHRyYWNrIElECisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGVjcnlwdEhhbmRsZSBIYW5kbGUgZm9yIHRoZSBkZWNyeXB0aW9uIHNlc3Npb24KKyAgICAgKiBAcGFyYW1bb3V0XSBidWZmZXIgUmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgcmVhZCBkYXRhLgorICAgICAqIEBwYXJhbVtpbl0gbnVtQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHBhcmFtW2luXSBvZmZzZXQgT2Zmc2V0IHdpdGggd2hpY2ggdG8gdXBkYXRlIHRoZSBmaWxlIHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KKyAgICAgKi8KKyAgICBzc2l6ZV90IHByZWFkKERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmX3Qgb2Zmc2V0KTsKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyB3aGV0aGVyIGFuIGFjdGlvbiBvbiB0aGUgRFJNIGNvbnRlbnQgaXMgYWxsb3dlZCBvciBub3QuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb24gdG8gdmFsaWRhdGUuIChBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjKQorICAgICAqIEBwYXJhbVtpbl0gZGVzY3JpcHRpb24gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGFsbG93ZWQuCisgICAgICovCisgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbihjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOworCisvKioKKyAqIEFQSXMgd2hpY2ggYXJlIGp1c3QgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBKYXZhIEFQSQorICoKKyAqLworcHVibGljOgorICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBjYWxsZXIgcmVxdWlyZWQgdG8KKyAgICAgKiByZWNlaXZlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBpbmZvTGlzdGVuZXIgTGlzdGVuZXIKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHNldE9uSW5mb0xpc3RlbmVyKGNvbnN0IHNwPERybU1hbmFnZXJDbGllbnQ6Ok9uSW5mb0xpc3RlbmVyPiYgaW5mb0xpc3RlbmVyKTsKKworICAgIC8qKgorICAgICAqIEdldCBjb25zdHJhaW50IGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnB1dCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb25zIGRlZmluZWQgc3VjaCBhcywKKyAgICAgKiAgICAgICAgICAgICBBY3Rpb246OkRFRkFVTFQsIEFjdGlvbjo6UExBWSwgZXRjCisgICAgICogQHJldHVybiBEcm1Db25zdHJhaW50cworICAgICAqICAgICBrZXktdmFsdWUgcGFpcnMgb2YgY29uc3RyYWludCBhcmUgZW1iZWRkZWQgaW4gaXQKKyAgICAgKiBAbm90ZQorICAgICAqICAgICBJbiBjYXNlIG9mIGVycm9yLCByZXR1cm4gTlVMTAorICAgICAqLworICAgIERybUNvbnN0cmFpbnRzKiBnZXRDb25zdHJhaW50cyhjb25zdCBTdHJpbmc4KiBwYXRoLCBjb25zdCBpbnQgYWN0aW9uKTsKKworICAgIC8qKgorICAgICAqIEdldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggaW5wdXQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBEcm1NZXRhZGF0YQorICAgICAqICAgICAgICAga2V5LXZhbHVlIHBhaXJzIG9mIG1ldGFkYXRhCisgICAgICogQG5vdGUKKyAgICAgKiAgICAgSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIE5VTEwKKyAgICAgKi8KKyAgICBEcm1NZXRhZGF0YSogZ2V0TWV0YWRhdGEoY29uc3QgU3RyaW5nOCogcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBtaW1ldHlwZSBvciBwYXRoIGNhbiBiZSBoYW5kbGVkCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgY29udGVudCBuZWVkcyB0byBiZSBoYW5kbGVkCisgICAgICogQHBhcmFtW2luXSBtaW1ldHlwZSBNaW1ldHlwZSBvZiB0aGUgY29udGVudCBuZWVkcyB0byBiZSBoYW5kbGVkCisgICAgICogQHJldHVybgorICAgICAqICAgICBUcnVlIGlmIERybU1hbmFnZXIgY2FuIGhhbmRsZSBnaXZlbiBwYXRoIG9yIG1pbWUgdHlwZS4KKyAgICAgKi8KKyAgICBib29sIGNhbkhhbmRsZShjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBnaXZlbiBkcm0gaW5mb3JtYXRpb24gYmFzZWQgb24gaXRzIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mbyBJbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKiBAcmV0dXJuIERybUluZm9TdGF0dXMKKyAgICAgKiAgICAgaW5zdGFuY2UgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBnaXZlbiBpbnB1dAorICAgICAqLworICAgIERybUluZm9TdGF0dXMqIHByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qIGRybUluZm8pOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgcmVnaXN0cmF0aW9uLCB1bnJlZ2lzdHJhdGlvbiBvciByaWdodHMKKyAgICAgKiBhY3F1aXNpdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZHJtSW5mb1JlcXVlc3QgUmVxdWVzdCBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSBkcm1JbmZvCisgICAgICogQHJldHVybiBEcm1JbmZvCisgICAgICogICAgIGluc3RhbmNlIGFzIGEgcmVzdWx0IG9mIHByb2Nlc3NpbmcgZ2l2ZW4gaW5wdXQKKyAgICAgKi8KKyAgICBEcm1JbmZvKiBhY3F1aXJlRHJtSW5mbyhjb25zdCBEcm1JbmZvUmVxdWVzdCogZHJtSW5mb1JlcXVlc3QpOworCisgICAgLyoqCisgICAgICogU2F2ZSBEUk0gcmlnaHRzIHRvIHNwZWNpZmllZCByaWdodHMgcGF0aAorICAgICAqIGFuZCBtYWtlIGFzc29jaWF0aW9uIHdpdGggY29udGVudCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRybVJpZ2h0cyBEcm1SaWdodHMgdG8gYmUgc2F2ZWQKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c1BhdGggRmlsZSBwYXRoIHdoZXJlIHJpZ2h0cyB0byBiZSBzYXZlZAorICAgICAqIEBwYXJhbVtpbl0gY29udGVudFBhdGggRmlsZSBwYXRoIHdoZXJlIGNvbnRlbnQgd2FzIHNhdmVkCisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzYXZlUmlnaHRzKAorICAgICAgICBjb25zdCBEcm1SaWdodHMmIGRybVJpZ2h0cywgY29uc3QgU3RyaW5nOCYgcmlnaHRzUGF0aCwgY29uc3QgU3RyaW5nOCYgY29udGVudFBhdGgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBtaW1lIHR5cGUgZW1iZWRkZWQgaW5zaWRlIHRoZSBvcmlnaW5hbCBjb250ZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggdGhlIHBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBTdHJpbmc4CisgICAgICogICAgIFJldHVybnMgbWltZS10eXBlIG9mIHRoZSBvcmlnaW5hbCBjb250ZW50LCBzdWNoIGFzICJ2aWRlby9tcGVnIgorICAgICAqLworICAgIFN0cmluZzggZ2V0T3JpZ2luYWxNaW1lVHlwZShjb25zdCBTdHJpbmc4JiBwYXRoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgdHlwZSBvZiB0aGUgcHJvdGVjdGVkIG9iamVjdCAoY29udGVudCwgcmlnaHRzLCBldGMuLikKKyAgICAgKiBieSB1c2luZyBzcGVjaWZpZWQgcGF0aCBvciBtaW1ldHlwZS4gQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBzaG91bGQgYmUgbm9uIG51bGwKKyAgICAgKiB0byByZXRyaWV2ZSBEUk0gb2JqZWN0IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBQYXRoIG9mIHRoZSBjb250ZW50IG9yIG51bGwuCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQgb3IgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHR5cGUgb2YgdGhlIERSTSBjb250ZW50LAorICAgICAqICAgICBzdWNoIGFzIERybU9iamVjdFR5cGU6OkNPTlRFTlQsIERybU9iamVjdFR5cGU6OlJJR0hUU19PQkpFQ1QKKyAgICAgKi8KKyAgICBpbnQgZ2V0RHJtT2JqZWN0VHlwZShjb25zdCBTdHJpbmc4JiBwYXRoLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjb250ZW50IGhhcyB2YWxpZCByaWdodHMgb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHBhdGggUGF0aCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKKyAgICAgKiBAcGFyYW1baW5dIGFjdGlvbiBBY3Rpb24gdG8gcGVyZm9ybQorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGZvciB0aGUgcHJvdGVjdGVkIGNvbnRlbnQsCisgICAgICogICAgIHN1Y2ggYXMgUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQsIFJpZ2h0c1N0YXR1czo6UklHSFRTX0VYUElSRUQsIGV0Yy4KKyAgICAgKi8KKyAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSByaWdodHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm90ZWN0ZWQgY29udGVudAorICAgICAqCisgICAgICogQHBhcmFtW2luXSBwYXRoIFBhdGggb2YgdGhlIHByb3RlY3RlZCBjb250ZW50CisgICAgICogQHJldHVybiBzdGF0dXNfdAorICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCByZW1vdmVSaWdodHMoY29uc3QgU3RyaW5nOCYgcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZUFsbFJpZ2h0cygpOworCisgICAgLyoqCisgICAgICogVGhpcyBBUEkgaXMgZm9yIEZvcndhcmQgTG9jayBEUk0uCisgICAgICogRWFjaCB0aW1lIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byBkb3dubG9hZCBhIG5ldyBEUk0gZmlsZQorICAgICAqIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiB0aGUgYXBwbGljYXRpb24gaGFzIHRvCisgICAgICogYmVnaW4gd2l0aCBjYWxsaW5nIHRoaXMgQVBJLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBEZXNjcmlwdGlvbi9NSU1FIHR5cGUgb2YgdGhlIGlucHV0IGRhdGEgcGFja2V0CisgICAgICogQHJldHVybiBSZXR1cm4gaGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICovCisgICAgaW50IG9wZW5Db252ZXJ0U2Vzc2lvbihjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBQYXNzZXMgdGhlIGlucHV0IGRhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQuIFRoZSByZXN1bHRhbnQKKyAgICAgKiBjb252ZXJ0ZWQgZGF0YSBhbmQgdGhlIHN0YXR1cyBpcyByZXR1cm5lZCBpbiB0aGUgRHJtQ29udmVydGVkSW5mbworICAgICAqIG9iamVjdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGFyZSBuZXcgYmxvY2sKKyAgICAgKiBvZiBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gY29udmVydElkIEhhbmRsZSBmb3IgdGhlIGNvbnZlcnQgc2Vzc2lvbgorICAgICAqIEBwYXJhbVtpbl0gaW5wdXREYXRhIElucHV0IERhdGEgd2hpY2ggbmVlZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybiBvYmplY3QgY29udGFpbnMgdGhlIHN0YXR1cyBvZiB0aGUgZGF0YSBjb252ZXJzaW9uLAorICAgICAqICAgICB0aGUgb3V0cHV0IGNvbnZlcnRlZCBkYXRhIGFuZCBvZmZzZXQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiAgICAgYXBwbGljYXRpb24gd2lsbCBpZ25vcmUgdGhlIG9mZnNldCBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBEcm1Db252ZXJ0ZWRTdGF0dXMqIGNvbnZlcnREYXRhKGludCBjb252ZXJ0SWQsIGNvbnN0IERybUJ1ZmZlciogaW5wdXREYXRhKTsKKworICAgIC8qKgorICAgICAqIFdoZW4gdGhlcmUgaXMgbm8gbW9yZSBkYXRhIHdoaWNoIG5lZWQgdG8gYmUgY29udmVydGVkIG9yIHdoZW4gYW4KKyAgICAgKiBlcnJvciBvY2N1cnMgdGhhdCB0aW1lIHRoZSBhcHBsaWNhdGlvbiBoYXMgdG8gaW5mb3JtIHRoZSBEcm0gYWdlbnQKKyAgICAgKiB2aWEgdGhpcyBBUEkuIFVwb24gc3VjY2Vzc2Z1bCBjb252ZXJzaW9uIG9mIHRoZSBjb21wbGV0ZSBkYXRhLAorICAgICAqIHRoZSBhZ2VudCB3aWxsIGluZm9ybSB0aGF0IHdoZXJlIHRoZSBoZWFkZXIgYW5kIGJvZHkgc2lnbmF0dXJlCisgICAgICogc2hvdWxkIGJlIGFkZGVkLiBUaGlzIHNpZ25hdHVyZSBhcHBlbmRpbmcgaXMgbmVlZGVkIHRvIGludGVncml0eQorICAgICAqIHByb3RlY3QgdGhlIGNvbnZlcnRlZCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBjb252ZXJ0SWQgSGFuZGxlIGZvciB0aGUgY29udmVydCBzZXNzaW9uCisgICAgICogQHJldHVybiBSZXR1cm4gb2JqZWN0IGNvbnRhaW5zIHRoZSBzdGF0dXMgb2YgdGhlIGRhdGEgY29udmVyc2lvbiwKKyAgICAgKiAgICAgdGhlIGhlYWRlciBhbmQgYm9keSBzaWduYXR1cmUgZGF0YS4gSXQgYWxzbyBpbmZvcm1zCisgICAgICogICAgIHRoZSBhcHBsaWNhdGlvbiBvbiB3aGljaCBvZmZzZXQgdGhlc2Ugc2lnbmF0dXJlIGRhdGEKKyAgICAgKiAgICAgc2hvdWxkIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIERybUNvbnZlcnRlZFN0YXR1cyogY2xvc2VDb252ZXJ0U2Vzc2lvbihpbnQgY29udmVydElkKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyBhbGwgRHJtU3VwcG9ydEluZm8gaW5zdGFuY2UgdGhhdCBuYXRpdmUgRFJNIGZyYW1ld29yayBjYW4gaGFuZGxlLgorICAgICAqIFRoaXMgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgSk5JIGxheWVyCisgICAgICoKKyAgICAgKiBAcGFyYW1bb3V0XSBsZW5ndGggTnVtYmVyIG9mIGVsZW1lbnRzIGluIGRybVN1cHBvcnRJbmZvQXJyYXkKKyAgICAgKiBAcGFyYW1bb3V0XSBkcm1TdXBwb3J0SW5mb0FycmF5IEFycmF5IGNvbnRhaW5zIGFsbCBEcm1TdXBwb3J0SW5mbworICAgICAqICAgICB0aGF0IG5hdGl2ZSBEUk0gZnJhbWV3b3JrIGNhbiBoYW5kbGUKKyAgICAgKiBAcmV0dXJuIHN0YXR1c190CisgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOworCitwcml2YXRlOgorICAgIGludCBtVW5pcXVlSWQ7CisgICAgTXV0ZXggbURlY3J5cHRMb2NrOworICAgIERybU1hbmFnZXJDbGllbnRJbXBsKiBtRHJtTWFuYWdlckNsaWVudEltcGw7Cit9OworCit9OworCisjZW5kaWYgLyogX19EUk1fTUFOQUdFUl9DTElFTlRfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1ldGFkYXRhLmggYi9pbmNsdWRlL2RybS9Ecm1NZXRhZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1NZXRhZGF0YS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9NRVRBREFUQV9IX18KKyNkZWZpbmUgX19EUk1fTUVUQURBVEFfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHdoaWNoIGNvbnRhaW5zIHRoZSBjb25zdHJhaW50cyBpbmZvcm1hdGlvbi4KKyAqCisgKiBBcyBhIHJlc3VsdCBvZiBEcm1NYW5hZ2VyQ2xpZW50OjpnZXRNZXRhZGF0YShjb25zdCBTdHJpbmc4KikKKyAqIGFuIGluc3RhbmNlIG9mIERybU1ldGFkYXRhIHdvdWxkIGJlIHJldHVybmVkLgorICovCitjbGFzcyBEcm1NZXRhZGF0YSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSXRlcmF0b3IgZm9yIGtleQorICAgICAqLworICAgIGNsYXNzIEtleUl0ZXJhdG9yIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIERybU1ldGFkYXRhOworICAgIHByaXZhdGU6CisgICAgICAgIEtleUl0ZXJhdG9yKERybU1ldGFkYXRhKiBkcm1NZXRhZGF0YSkgOiBtRHJtTWV0YWRhdGEoZHJtTWV0YWRhdGEpLCBtSW5kZXgoMCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgS2V5SXRlcmF0b3IoY29uc3QgS2V5SXRlcmF0b3ImIGtleUl0ZXJhdG9yKTsKKyAgICAgICAgS2V5SXRlcmF0b3ImIG9wZXJhdG9yPShjb25zdCBLZXlJdGVyYXRvciYga2V5SXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5LZXlJdGVyYXRvcigpIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzTmV4dCgpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1NZXRhZGF0YSogbURybU1ldGFkYXRhOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3IgY29uc3RyYWludHMKKyAgICAgKi8KKyAgICBjbGFzcyBJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1NZXRhZGF0YTsKKyAgICBwcml2YXRlOgorICAgICAgICBJdGVyYXRvcihEcm1NZXRhZGF0YSogZHJtTWV0YWRhdGEpIDogbURybU1ldGFkYXRhKGRybU1ldGFkYXRhKSwgbUluZGV4KDApIHt9CisKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKGNvbnN0IEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgSXRlcmF0b3ImIGl0ZXJhdG9yKTsKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCBuZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEcm1NZXRhZGF0YSogbURybU1ldGFkYXRhOworICAgICAgICB1bnNpZ25lZCBpbnQgbUluZGV4OworICAgIH07CisKK3B1YmxpYzoKKyAgICBEcm1NZXRhZGF0YSgpIHt9CisgICAgdmlydHVhbCB+RHJtTWV0YWRhdGEoKSB7CisgICAgICAgIERybU1ldGFkYXRhOjpLZXlJdGVyYXRvciBrZXlJdCA9IHRoaXMtPmtleUl0ZXJhdG9yKCk7CisKKyAgICAgICAgd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBrZXlJdC5uZXh0KCk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSA9IHRoaXMtPmdldEFzQnl0ZUFycmF5KCZrZXkpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbU1ldGFkYXRhTWFwLmNsZWFyKCk7CisgICAgfQorCitwdWJsaWM6CisgICAgaW50IGdldENvdW50KHZvaWQpIGNvbnN0OworICAgIHN0YXR1c190IHB1dChjb25zdCBTdHJpbmc4KiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgICBTdHJpbmc4IGdldChjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIGdldEFzQnl0ZUFycmF5KGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3Q7CisgICAgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKTsKKyAgICBJdGVyYXRvciBpdGVyYXRvcigpOworCitwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIGdldFZhbHVlKGNvbnN0IFN0cmluZzgqIGtleSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBLZXllZFZlY3RvcjxTdHJpbmc4LCBjb25zdCBjaGFyKj4gRHJtTWV0YWRhdGFNYXA7CisgICAgRHJtTWV0YWRhdGFNYXAgbU1ldGFkYXRhTWFwOworfTsKKworfTsKKworI2VuZGlmIC8qIF9fRFJNX01FVEFEQVRBX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9Ecm1SaWdodHMuaCBiL2luY2x1ZGUvZHJtL0RybVJpZ2h0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjhmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1SaWdodHMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19EUk1fUklHSFRTX0hfXworI2RlZmluZSBfX0RSTV9SSUdIVFNfSF9fCisKKyNpbmNsdWRlICJkcm1fZnJhbWV3b3JrX2NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHdoaWNoIHdyYXBzIHRoZSBsaWNlbnNlIGluZm9ybWF0aW9uIHdoaWNoIHdhcworICogcmV0cmlldmVkIGZyb20gdGhlIG9ubGluZSBEUk0gc2VydmVyLgorICoKKyAqIENhbGxlciBjYW4gaW5zdGFudGlhdGUgRHJtUmlnaHRzIGJ5IGludm9raW5nIERybVJpZ2h0cyhjb25zdCBEcm1CdWZmZXImLCBTdHJpbmcpCisgKiBjb25zdHJ1Y3RvciBieSB1c2luZyB0aGUgcmVzdWx0IG9mIERybU1hbmFnZXJDbGllbnQ6OlByb2Nlc3NEcm1JbmZvKGNvbnN0IERybUluZm8qKSBBUEkuCisgKiBDYWxsZXIgY2FuIGFsc28gaW5zdGFudGlhdGUgRHJtUmlnaHRzIHVzaW5nIHRoZSBmaWxlIHBhdGggd2hpY2ggY29udGFpbnMgcmlnaHRzIGluZm9ybWF0aW9uLgorICoKKyAqLworY2xhc3MgRHJtUmlnaHRzIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgRHJtUmlnaHRzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJpZ2h0c0ZpbGVQYXRoIFBhdGggb2YgdGhlIGZpbGUgY29udGFpbmluZyByaWdodHMgZGF0YQorICAgICAqIEBwYXJhbVtpbl0gbWltZVR5cGUgTUlNRSB0eXBlCisgICAgICogQHBhcmFtW2luXSBhY2NvdW50SWQgQWNjb3VudCBJZCBvZiB0aGUgdXNlcgorICAgICAqIEBwYXJhbVtpbl0gc3Vic2NyaXB0aW9uSWQgU3Vic2NyaXB0aW9uIElkIG9mIHRoZSB1c2VyCisgICAgICovCisgICAgRHJtUmlnaHRzKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmlnaHRzRmlsZVBhdGgsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWNjb3VudElkID0gU3RyaW5nOCgiX05PX1VTRVIiKSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN1YnNjcmlwdGlvbklkID0gU3RyaW5nOCgiIikpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybVJpZ2h0cworICAgICAqCisgICAgICogQHBhcmFtW2luXSByaWdodHNEYXRhIFJpZ2h0cyBkYXRhCisgICAgICogQHBhcmFtW2luXSBtaW1lVHlwZSBNSU1FIHR5cGUKKyAgICAgKiBAcGFyYW1baW5dIGFjY291bnRJZCBBY2NvdW50IElkIG9mIHRoZSB1c2VyCisgICAgICogQHBhcmFtW2luXSBzdWJzY3JpcHRpb25JZCBTdWJzY3JpcHRpb24gSWQgb2YgdGhlIHVzZXIKKyAgICAgKi8KKyAgICBEcm1SaWdodHMoCisgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIHJpZ2h0c0RhdGEsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWNjb3VudElkID0gU3RyaW5nOCgiX05PX1VTRVIiKSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN1YnNjcmlwdGlvbklkID0gU3RyaW5nOCgiIikpOworCisgICAgLyoqCisgICAgICogRGVzdHJ1Y3RvciBmb3IgRHJtUmlnaHRzCisgICAgICovCisgICAgdmlydHVhbCB+RHJtUmlnaHRzKCk7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByaWdodHMgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBSaWdodHMgZGF0YQorICAgICAqLworICAgIGNvbnN0IERybUJ1ZmZlciYgZ2V0RGF0YSh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1JTUUgdHlwZQorICAgICAqLworICAgIFN0cmluZzggZ2V0TWltZVR5cGUodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY2NvdW50LWlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFjY291bnQgSWQKKyAgICAgKi8KKyAgICBTdHJpbmc4IGdldEFjY291bnRJZCh2b2lkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN1YnNjcmlwdGlvbi1pZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3Vic2NyaXB0aW9uIElkCisgICAgICovCisgICAgU3RyaW5nOCBnZXRTdWJzY3JpcHRpb25JZCh2b2lkKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBEcm1CdWZmZXIgbURhdGE7CisgICAgU3RyaW5nOCBtTWltZVR5cGU7CisgICAgU3RyaW5nOCBtQWNjb3VudElkOworICAgIFN0cmluZzggbVN1YnNjcmlwdGlvbklkOworICAgIGNoYXIqIG1SaWdodHNGcm9tRmlsZTsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9SSUdIVFNfSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybVN1cHBvcnRJbmZvLmggYi9pbmNsdWRlL2RybS9Ecm1TdXBwb3J0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9Ecm1TdXBwb3J0SW5mby5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9TVVBQT1JUX0lORk9fSF9fCisjZGVmaW5lIF9fRFJNX1NVUFBPUlRfSU5GT19IX18KKworI2luY2x1ZGUgImRybV9mcmFtZXdvcmtfY29tbW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGlzIGFuIHV0aWxpdHkgY2xhc3Mgd2hpY2ggd3JhcHMgdGhlIGNhcGFiaWxpdHkgb2YgZWFjaCBwbHVnLWluLAorICogc3VjaCBhcyBtaW1ldHlwZSdzIGFuZCBmaWxlIHN1ZmZpeGVzIGl0IGNvdWxkIGhhbmRsZS4KKyAqCisgKiBQbHVnLWluIGRldmVsb3BlciBjb3VsZCByZXR1cm4gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIHBsdWdpbiBieSBwYXNzaW5nCisgKiBEcm1TdXBwb3J0SW5mbyBpbnN0YW5jZS4KKyAqCisgKi8KK2NsYXNzIERybVN1cHBvcnRJbmZvIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBmb3IgbU1pbWVUeXBlVmVjdG9yCisgICAgICovCisgICAgY2xhc3MgTWltZVR5cGVJdGVyYXRvciB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBEcm1TdXBwb3J0SW5mbzsKKyAgICBwcml2YXRlOgorICAgICAgICBNaW1lVHlwZUl0ZXJhdG9yKERybVN1cHBvcnRJbmZvKiBkcm1TdXBwb3J0SW5mbykKKyAgICAgICAgICAgOiBtRHJtU3VwcG9ydEluZm8oZHJtU3VwcG9ydEluZm8pLCBtSW5kZXgoMCkge30KKyAgICBwdWJsaWM6CisgICAgICAgIE1pbWVUeXBlSXRlcmF0b3IoY29uc3QgTWltZVR5cGVJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICBNaW1lVHlwZUl0ZXJhdG9yJiBvcGVyYXRvcj0oY29uc3QgTWltZVR5cGVJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5NaW1lVHlwZUl0ZXJhdG9yKCkge30KKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNOZXh0KCk7CisgICAgICAgIFN0cmluZzgmIG5leHQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIERybVN1cHBvcnRJbmZvKiBtRHJtU3VwcG9ydEluZm87CisgICAgICAgIHVuc2lnbmVkIGludCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIGZvciBtRmlsZVN1ZmZpeFZlY3RvcgorICAgICAqLworICAgIGNsYXNzIEZpbGVTdWZmaXhJdGVyYXRvciB7CisgICAgICAgZnJpZW5kIGNsYXNzIERybVN1cHBvcnRJbmZvOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRmlsZVN1ZmZpeEl0ZXJhdG9yKERybVN1cHBvcnRJbmZvKiBkcm1TdXBwb3J0SW5mbykKKyAgICAgICAgICAgIDogbURybVN1cHBvcnRJbmZvKGRybVN1cHBvcnRJbmZvKSwgbUluZGV4KDApIHt9CisgICAgcHVibGljOgorICAgICAgICBGaWxlU3VmZml4SXRlcmF0b3IoY29uc3QgRmlsZVN1ZmZpeEl0ZXJhdG9yJiBpdGVyYXRvcik7CisgICAgICAgIEZpbGVTdWZmaXhJdGVyYXRvciYgb3BlcmF0b3I9KGNvbnN0IEZpbGVTdWZmaXhJdGVyYXRvciYgaXRlcmF0b3IpOworICAgICAgICB2aXJ0dWFsIH5GaWxlU3VmZml4SXRlcmF0b3IoKSB7fQorCisgICAgcHVibGljOgorICAgICAgICBib29sIGhhc05leHQoKTsKKyAgICAgICAgU3RyaW5nOCYgbmV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgRHJtU3VwcG9ydEluZm8qIG1Ecm1TdXBwb3J0SW5mbzsKKyAgICAgICAgdW5zaWduZWQgaW50IG1JbmRleDsKKyAgICB9OworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIERybVN1cHBvcnRJbmZvCisgICAgICovCisgICAgRHJtU3VwcG9ydEluZm8oKTsKKworICAgIC8qKgorICAgICAqIENvcHkgY29uc3RydWN0b3IgZm9yIERybVN1cHBvcnRJbmZvCisgICAgICovCisgICAgRHJtU3VwcG9ydEluZm8oY29uc3QgRHJtU3VwcG9ydEluZm8mIGRybVN1cHBvcnRJbmZvKTsKKworICAgIC8qKgorICAgICAqIERlc3RydWN0b3IgZm9yIERybVN1cHBvcnRJbmZvCisgICAgICovCisgICAgdmlydHVhbCB+RHJtU3VwcG9ydEluZm8oKSB7fQorCisgICAgRHJtU3VwcG9ydEluZm8mIG9wZXJhdG9yPShjb25zdCBEcm1TdXBwb3J0SW5mbyYgZHJtU3VwcG9ydEluZm8pOworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbykgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERybVN1cHBvcnRJbmZvJiBkcm1TdXBwb3J0SW5mbykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIEZpbGVTdWZmaXhJdGVyYXRvciBvYmplY3QgdG8gd2FsayB0aHJvdWdoIGZpbGUgc3VmZml4IHZhbHVlcworICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEZpbGVTdWZmaXhJdGVyYXRvciBvYmplY3QKKyAgICAgKi8KKyAgICBGaWxlU3VmZml4SXRlcmF0b3IgZ2V0RmlsZVN1ZmZpeEl0ZXJhdG9yKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE1pbWVUeXBlSXRlcmF0b3Igb2JqZWN0IHRvIHdhbGsgdGhyb3VnaCBtaW1ldHlwZSB2YWx1ZXMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZQorICAgICAqCisgICAgICogQHJldHVybiBNaW1lVHlwZUl0ZXJhdG9yIG9iamVjdAorICAgICAqLworICAgIE1pbWVUeXBlSXRlcmF0b3IgZ2V0TWltZVR5cGVJdGVyYXRvcigpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbWV0eXBlcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBtaW1ldHlwZXMgc3VwcG9ydGVkCisgICAgICovCisgICAgaW50IGdldE1pbWVUeXBlQ291bnQodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmlsZSB0eXBlcyBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBmaWxlIHR5cGVzIHN1cHBvcnRlZAorICAgICAqLworICAgIGludCBnZXRGaWxlU3VmZml4Q291bnQodm9pZCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBtaW1ldHlwZSB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgbWltZXR5cGVzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIG1pbWV0eXBlIHRvIGJlIGFkZGVkCisgICAgICogQHJldHVybiBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBhZGRNaW1lVHlwZShjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBmaWxlc3VmZml4IHRvIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmaWxlIHR5cGVzCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGZpbGVzdWZmaXggZmlsZSBzdWZmaXggdG8gYmUgYWRkZWQKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQorICAgICAqLworICAgIHN0YXR1c190IGFkZEZpbGVTdWZmaXgoY29uc3QgU3RyaW5nOCYgZmlsZVN1ZmZpeCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVuaXF1ZSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgcGx1Z2luCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRlc2NyaXB0aW9uIFVuaXF1ZSBkZXNjcmlwdGlvbgorICAgICAqIEByZXR1cm4gUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0RGVzY3JpcHRpb24oY29uc3QgU3RyaW5nOCYgZGVzY3JpcHRpb24pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGx1Z2luCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVuaXF1ZSBkZXNjcmlwdGlvbgorICAgICAqLworICAgIFN0cmluZzggZ2V0RGVzY3JpcHRpb24oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBnaXZlbiBtaW1ldHlwZSBpcyBzdXBwb3J0ZWQgb3Igbm90CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1pbWVUeXBlIE1JTUUgdHlwZQorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgICAgdHJ1ZSAtIGlmIG1pbWUtdHlwZSBpcyBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgZmFsc2UgLSBpZiBtaW1lLXR5cGUgaXMgbm90IHN1cHBvcnRlZAorICAgICAqLworICAgIGJvb2wgaXNTdXBwb3J0ZWRNaW1lVHlwZShjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgZ2l2ZW4gZmlsZSB0eXBlIGlzIHN1cHBvcnRlZCBvciBub3QKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZmlsZVR5cGUgRmlsZSB0eXBlCisgICAgICogQHJldHVybgorICAgICAqICAgICB0cnVlIGlmIGZpbGUgdHlwZSBpcyBzdXBwb3J0ZWQKKyAgICAgKiAgICAgZmFsc2UgaWYgZmlsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBib29sIGlzU3VwcG9ydGVkRmlsZVN1ZmZpeChjb25zdCBTdHJpbmc4JiBmaWxlVHlwZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPFN0cmluZzg+IG1NaW1lVHlwZVZlY3RvcjsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbUZpbGVTdWZmaXhWZWN0b3I7CisKKyAgICBTdHJpbmc4IG1EZXNjcmlwdGlvbjsKK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9TVVBQT1JUX0lORk9fSF9fICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmggYi9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzY1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RSTV9GUkFNRVdPUktfQ09NTU9OX0hfXworI2RlZmluZSBfX0RSTV9GUkFNRVdPUktfQ09NTU9OX0hfXworCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNkZWZpbmUgSU5WQUxJRF9WQUxVRSAtMQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRXJyb3IgY29kZSBmb3IgRFJNIEZyYW1lb3dyaworICovCitlbnVtIHsKKyAgICBEUk1fRVJST1JfQkFTRSA9IC0yMDAwLAorCisgICAgRFJNX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UsCisgICAgRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxLAorICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMiwKKyAgICBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCAgPSBEUk1fRVJST1JfQkFTRSAtIDMsCisgICAgRFJNX0VSUk9SX0RFQ1JZUFQgICAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA0LAorICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNSwKKworICAgIERSTV9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5PX0VSUk9SCit9OworCisvKioKKyAqIERlZmluZXMgRFJNIEJ1ZmZlcgorICovCitjbGFzcyBEcm1CdWZmZXIgeworcHVibGljOgorICAgIGNoYXIqIGRhdGE7CisgICAgaW50IGxlbmd0aDsKKworICAgIERybUJ1ZmZlcigpIDoKKyAgICAgICAgZGF0YShOVUxMKSwKKyAgICAgICAgbGVuZ3RoKDApIHsKKyAgICB9CisKKyAgICBEcm1CdWZmZXIoY2hhciogZGF0YUJ5dGVzLCBpbnQgZGF0YUxlbmd0aCkgOgorICAgICAgICBkYXRhKGRhdGFCeXRlcyksCisgICAgICAgIGxlbmd0aChkYXRhTGVuZ3RoKSB7CisgICAgfQorCit9OworCisvKioKKyAqIERlZmluZXMgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGFjdGlvbgorICovCitjbGFzcyBBY3Rpb25EZXNjcmlwdGlvbiB7CitwdWJsaWM6CisgICAgQWN0aW9uRGVzY3JpcHRpb24oaW50IF9vdXRwdXRUeXBlLCBpbnQgX2NvbmZpZ3VyYXRpb24pIDoKKyAgICAgICAgb3V0cHV0VHlwZShfb3V0cHV0VHlwZSksCisgICAgICAgIGNvbmZpZ3VyYXRpb24oX2NvbmZpZ3VyYXRpb24pIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbnQgb3V0cHV0VHlwZTsgICAvKiBCTFVFVE9PVEggLCBIRE1JKi8KKyAgICBpbnQgY29uZmlndXJhdGlvbjsgLyogUkVTT0xVVElPTl83MjBfNDgwICwgUkVDT1JEQUJMRSBldGMuKi8KK307CisKKy8qKgorICogRGVmaW5lcyBjb25zdGFudHMgcmVsYXRlZCB0byBEUk0gdHlwZXMKKyAqLworY2xhc3MgRHJtT2JqZWN0VHlwZSB7Citwcml2YXRlOgorICAgIERybU9iamVjdFR5cGUoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgdW5rbm93biB0eXBlCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMHgwMDsKKyAgICAvKioKKyAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHByb3RlY3RlZCBjb250ZW50IHR5cGUKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IENPTlRFTlQgPSAweDAxOworICAgIC8qKgorICAgICAqIEZpZWxkIHNwZWNpZmllcyB0aGUgcmlnaHRzIGluZm9ybWF0aW9uCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSSUdIVFNfT0JKRUNUID0gMHgwMjsKKyAgICAvKioKKyAgICAgKiBGaWVsZCBzcGVjaWZpZXMgdGhlIHRyaWdnZXIgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFRSSUdHRVJfT0JKRUNUID0gMHgwMzsKK307CisKKy8qKgorICogRGVmaW5lcyBjb25zdGFudHMgcmVsYXRlZCB0byBwbGF5IGJhY2sKKyAqLworY2xhc3MgUGxheWJhY2sgeworcHJpdmF0ZToKKyAgICBQbGF5YmFjaygpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHBsYXliYWNrIHN0YXJ0CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBTVEFSVCA9IDB4MDA7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHBsYXliYWNrIHN0b3AKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFNUT1AgPSAweDAxOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyBwbGF5YmFjayBwYXVzZWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFBBVVNFID0gMHgwMjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgcGxheWJhY2sgcmVzdW1lZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUkVTVU1FID0gMHgwMzsKK307CisKKy8qKgorICogRGVmaW5lcyBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBwcm90ZWN0ZWQgY29udGVudAorICovCitjbGFzcyBBY3Rpb24geworcHJpdmF0ZToKKyAgICBBY3Rpb24oKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBkZWZhdWx0IGFjdGlvbgorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVCA9IDB4MDA7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHBsYXllZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUExBWSA9IDB4MDE7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIHNldCBhcyByaW5nIHRvbmUKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJTkdUT05FID0gMHgwMjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gYmUgdHJhbnNmZXJlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgVFJBTlNGRVIgPSAweDAzOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSBjb250ZW50IGNhbiBiZSBzZXQgYXMgb3V0cHV0CisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBPVVRQVVQgPSAweDA0OworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHByZXZpZXcgaXMgYWxsb3dlZAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUFJFVklFVyA9IDB4MDU7CisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZmllbGQgc2lnbmlmaWVzIHRoYXQgdGhlIGNvbnRlbnQgY2FuIGJlIGV4ZWN1dGVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBFWEVDVVRFID0gMHgwNjsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgY29udGVudCBjYW4gZGlzcGxheWVkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBESVNQTEFZID0gMHgwNzsKK307CisKKy8qKgorICogRGVmaW5lcyBjb25zdGFudHMgcmVsYXRlZCB0byBzdGF0dXMgb2YgdGhlIHJpZ2h0cworICovCitjbGFzcyBSaWdodHNTdGF0dXMgeworcHJpdmF0ZToKKyAgICBSaWdodHNTdGF0dXMoKTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIHZhbGlkCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBSSUdIVFNfVkFMSUQgPSAweDAwOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIGludmFsaWQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19JTlZBTElEID0gMHgwMTsKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmaWVsZCBzaWduaWZpZXMgdGhhdCB0aGUgcmlnaHRzIGFyZSBleHBpcmVkIGZvciB0aGUgY29udGVudAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgUklHSFRTX0VYUElSRUQgPSAweDAyOworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZpZWxkIHNpZ25pZmllcyB0aGF0IHRoZSByaWdodHMgYXJlIG5vdCBhY3F1aXJlZCBmb3IgdGhlIGNvbnRlbnQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IFJJR0hUU19OT1RfQUNRVUlSRUQgPSAweDAzOworfTsKKworLyoqCisgKiBEZWZpbmVzIEFQSSBzZXQgZm9yIGRlY3J5cHRpb24KKyAqLworY2xhc3MgRGVjcnlwdEFwaVR5cGUgeworcHJpdmF0ZToKKyAgICBEZWNyeXB0QXBpVHlwZSgpOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogRGVjcnlwdCBBUEkgc2V0IGZvciBub24gZW5jcnlwdGVkIGNvbnRlbnQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgaW50IE5PTl9FTkNSWVBURUQgPSAweDAwOworICAgIC8qKgorICAgICAqIERlY3J5cHQgQVBJIHNldCBmb3IgRVMgYmFzZWQgRFJNCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBFTEVNRU5UQVJZX1NUUkVBTV9CQVNFRCA9IDB4MDE7CisgICAgLyoqCisgICAgICogUE9TSVggYmFzZWQgRGVjcnlwdCBBUEkgc2V0IGZvciBjb250YWluZXIgYmFzZWQgRFJNCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBDT05UQUlORVJfQkFTRUQgPSAweDAyOworfTsKKworLyoqCisgKiBEZWZpbmVzIGRlY3J5cHRpb24gaW5mb3JtYXRpb24KKyAqLworY2xhc3MgRGVjcnlwdEluZm8geworcHVibGljOgorICAgIC8qKgorICAgICAqIHNpemUgb2YgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZCB0byBnZXQgdGhlIGRlY3J5cHRlZCBjb250ZW50LgorICAgICAqLworICAgIGludCBkZWNyeXB0QnVmZmVyTGVuZ3RoOworICAgIC8qKgorICAgICAqIHJlc2VydmVkIGZvciBmdXR1cmUgcHVycG9zZQorICAgICAqLworfTsKKworLyoqCisgKiBEZWZpbmVzIGRlY3J5cHRpb24gaGFuZGxlCisgKi8KK2NsYXNzIERlY3J5cHRIYW5kbGUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIERlY3J5cHRpb24gc2Vzc2lvbiBIYW5kbGUKKyAgICAgKi8KKyAgICBpbnQgZGVjcnlwdElkOworICAgIC8qKgorICAgICAqIE1pbWV0eXBlIG9mIHRoZSBjb250ZW50IHRvIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBtZWRpYSBleHRyYWN0b3IKKyAgICAgKiBGb3IgZS5nLiwgInZpZGVvL21wZWciIG9yICJhdWRpby9tcDMiCisgICAgICovCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoaWNoIGRlY3J5cHRpb24gcGF0dGVybiBzaG91bGQgYmUgdXNlZCB0byBkZWNyeXB0IHRoZSBnaXZlbiBjb250ZW50CisgICAgICogRHJtRnJhbWV3b3JrIHByb3ZpZGVzIHR3byBkaWZmZXJlbnQgc2V0IG9mIGRlY3J5cHRpb24gQVBJcy4KKyAgICAgKiAgIDEuIERlY3J5cHQgQVBJcyBmb3IgZWxlbWVudGFyeSBzdHJlYW0gYmFzZWQgRFJNCisgICAgICogICAgICAoZmlsZSBmb3JtYXQgaXMgbm90IGVuY3J5cHRlZCBidXQgRVMgaXMgZW5jcnlwdGVkKQorICAgICAqICAgICAgICAgZS5nLiwgTWFybGluIERSTSAoTVA0IGZpbGUgZm9ybWF0KSwgV00tRFJNIChhc2YgZmlsZSBmb3JtYXQpCisgICAgICoKKyAgICAgKiAgICAgICAgIERlY3J5cHRBcGlUeXBlOjpFTEVNRU5UQVJZX1NUUkVBTV9CQVNFRAorICAgICAqICAgICAgICAgICAgIERlY3J5cHRpb24gQVBJIHNldCBmb3IgRVMgYmFzZWQgRFJNCisgICAgICogICAgICAgICAgICAgICAgIGluaXRpYWxpemVEZWNyeXB0VW5pdCgpLCBkZWNyeXB0KCksIGFuZCBmaW5hbGl6ZURlY3J5cHRVbml0KCkKKyAgICAgKiAgIDIuIERlY3J5cHQgQVBJcyBmb3IgY29udGFpbmVyIGJhc2VkIERSTSAoZmlsZSBmb3JtYXQgaXRzZWxmIGlzIGVuY3J5cHRlZCkKKyAgICAgKiAgICAgICAgIGUuZy4sIE9NQSBEUk0gKGRjZiBmaWxlIGZvcm1hdCkKKyAgICAgKgorICAgICAqICAgICAgICAgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAorICAgICAqICAgICAgICAgICAgIFBPU0lYIGJhc2VkIERlY3J5cHRpb24gQVBJIHNldCBmb3IgY29udGFpbmVyIGJhc2VkIERSTQorICAgICAqICAgICAgICAgICAgICAgICBwcmVhZCgpCisgICAgICovCisgICAgaW50IGRlY3J5cHRBcGlUeXBlOworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIHN0YXR1cyBvZiB0aGUgcmlnaHRzIGxpa2UKKyAgICAgKiAgICAgUklHSFRTX1ZBTElELCBSSUdIVFNfSU5WQUxJRCwgUklHSFRTX0VYUElSRUQgb3IgUklHSFRTX05PVF9BQ1FVSVJFRAorICAgICAqLworICAgIGludCBzdGF0dXM7CisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gZGVjcnlwdCBjb250ZW50CisgICAgICogZS5nLiBzaXplIG9mIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgdG8gZ2V0IHRoZSBkZWNyeXB0ZWQgY29udGVudC4KKyAgICAgKi8KKyAgICBEZWNyeXB0SW5mbyogZGVjcnlwdEluZm87CisKK3B1YmxpYzoKKyAgICBEZWNyeXB0SGFuZGxlKCk6CisgICAgICAgICAgICBkZWNyeXB0SWQoSU5WQUxJRF9WQUxVRSksCisgICAgICAgICAgICBtaW1lVHlwZSgiIiksCisgICAgICAgICAgICBkZWNyeXB0QXBpVHlwZShJTlZBTElEX1ZBTFVFKSwKKyAgICAgICAgICAgIHN0YXR1cyhJTlZBTElEX1ZBTFVFKSB7CisKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBEZWNyeXB0SGFuZGxlJiBoYW5kbGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChkZWNyeXB0SWQgPCBoYW5kbGUuZGVjcnlwdElkKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVjcnlwdEhhbmRsZSYgaGFuZGxlKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoZGVjcnlwdElkID09IGhhbmRsZS5kZWNyeXB0SWQpOworICAgIH0KK307CisKK307CisKKyNlbmRpZiAvKiBfX0RSTV9GUkFNRVdPUktfQ09NTU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IGEzZGEzZWQuLmQwYjlmY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03Myw2ICs3NCwxMyBAQAogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU25pZmZlcihTbmlmZmVyRnVuYyBmdW5jKTsKICAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpOwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogRHJtSW5pdGlhbGl6YXRpb24oRHJtTWFuYWdlckNsaWVudCAqY2xpZW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7fTsKKworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKaW5kZXggOGEyMTVlYS4uNDMwNzI2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNywxNSArMzgsMjkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIERybUluaXRpYWxpemF0aW9uKERybU1hbmFnZXJDbGllbnQgKmNsaWVudCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBGSUxFICptRmlsZTsKKyAgICBpbnQgbUZkOwogICAgIGludDY0X3QgbU9mZnNldDsKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAgICAgTXV0ZXggbUxvY2s7CiAKKyAgICAvKmZvciBEUk0qLworICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIGludDY0X3QgbURybUJ1Zk9mZnNldDsKKyAgICBpbnQ2NF90IG1Ecm1CdWZTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CisKKyAgICBzc2l6ZV90IHJlYWRBdERSTShvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKwogICAgIEZpbGVTb3VyY2UoY29uc3QgRmlsZVNvdXJjZSAmKTsKICAgICBGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgRmlsZVNvdXJjZSAmKTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggZTQ0MTIyZC4uNmRmNGQ4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtNDAsNiArNDAsOCBAQAogICAgIC8vIE5vdCB0ZWNobmljYWxseSBhbiBlcnJvci4KICAgICBJTkZPX0ZPUk1BVF9DSEFOR0VEICAgID0gTUVESUFfRVJST1JfQkFTRSAtIDEyLAogICAgIElORk9fRElTQ09OVElOVUlUWSAgICAgPSBNRURJQV9FUlJPUl9CQVNFIC0gMTMsCisKKyAgICBFUlJPUl9OT19MSUNFTlNFICAgICAgID0gTUVESUFfRVJST1JfQkFTRSAtIDE0LAogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaAppbmRleCAxNmIwYTRjLi5hODIxMDZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oCkBAIC01NSw2ICs1NSwxMiBAQAogICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgdm9pZCBzZXREcm1GbGFnKGJvb2wgZmxhZykge307CisgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIE1lZGlhRXh0cmFjdG9yKCkge30KICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpIHt9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKaW5kZXggYmZmYjllMC4uZWEyZmE1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApAQCAtNTgsNiArNTgsOCBAQAogICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKICAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCiAgICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAorICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCiAKICAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCiAgICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggNmY1ODFkMy4uYzUxMTJhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC04MSwxMyArODEsMTMgQEAKIH0KIAogc3RhdGljIGJvb2wgZmlsZU1hdGNoZXNFeHRlbnNpb24oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogZXh0ZW5zaW9ucykgewotICAgIGNoYXIqIGV4dGVuc2lvbiA9IHN0cnJjaHIocGF0aCwgJy4nKTsKKyAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSBzdHJyY2hyKHBhdGgsICcuJyk7CiAgICAgaWYgKCFleHRlbnNpb24pIHJldHVybiBmYWxzZTsKICAgICArK2V4dGVuc2lvbjsgICAgLy8gc2tpcCB0aGUgZG90CiAgICAgaWYgKGV4dGVuc2lvblswXSA9PSAwKSByZXR1cm4gZmFsc2U7CiAKICAgICB3aGlsZSAoZXh0ZW5zaW9uc1swXSkgewotICAgICAgICBjaGFyKiBjb21tYSA9IHN0cmNocihleHRlbnNpb25zLCAnLCcpOworICAgICAgICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihleHRlbnNpb25zLCAnLCcpOwogICAgICAgICBzaXplX3QgbGVuZ3RoID0gKGNvbW1hID8gY29tbWEgLSBleHRlbnNpb25zIDogc3RybGVuKGV4dGVuc2lvbnMpKTsKICAgICAgICAgaWYgKGxlbmd0aCA9PSBzdHJsZW4oZXh0ZW5zaW9uKSAmJiBzdHJuY2FzZWNtcChleHRlbnNpb24sIGV4dGVuc2lvbnMsIGxlbmd0aCkgPT0gMCkgcmV0dXJuIHRydWU7CiAgICAgICAgIGV4dGVuc2lvbnMgKz0gbGVuZ3RoOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggNjE1ZjNlOC4uZDY3NDU0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMSw2ICsxMSw3IEBACiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERSTUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEhUVFBTdHJlYW0uY3BwICAgICAgICAgICAgICAgICAgICBcCkBAIC01OSw3ICs2MCw4IEBACiAgICAgICAgIGxpYnNvbml2b3ggICAgICAgIFwKICAgICAgICAgbGlidm9yYmlzaWRlYyAgICAgXAogICAgICAgICBsaWJzdXJmYWNlZmxpbmdlcl9jbGllbnQgXAotICAgICAgICBsaWJjYW1lcmFfY2xpZW50CisgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAorICAgICAgICBsaWJkcm1mcmFtZXdvcmsKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2FhY2RlYyBcCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDdkYmIxNDUuLjUwYzVmM2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0yNDUsNyArMjQ1LDggQEAKICAgICAgIG1FeHRyYWN0b3JGbGFncygwKSwKICAgICAgIG1MYXN0VmlkZW9CdWZmZXIoTlVMTCksCiAgICAgICBtVmlkZW9CdWZmZXIoTlVMTCksCi0gICAgICBtU3VzcGVuc2lvblN0YXRlKE5VTEwpIHsKKyAgICAgIG1TdXNwZW5zaW9uU3RhdGUoTlVMTCksCisgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSB7CiAgICAgQ0hFQ0tfRVEobUNsaWVudC5jb25uZWN0KCksIE9LKTsKIAogICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CkBAIC0zNDQsNiArMzQ1LDEyIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8oJm1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIEVSUk9SX05PX0xJQ0VOU0UpOworICAgIH0KKwogICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKIH0KIApAQCAtNDE5LDYgKzQyNiwxMyBAQAogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnJlc2V0X2woKSB7CisgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2s6OlNUT1AsIDApOworICAgICAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKwogICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKICAgICAgICAgbUZsYWdzIHw9IFBSRVBBUkVfQ0FOQ0VMTEVEOwogICAgICAgICBpZiAobUNvbm5lY3RpbmdEYXRhU291cmNlICE9IE5VTEwpIHsKQEAgLTc2Miw2ICs3NzYsMTMgQEAKIAogICAgIGJvb2wgZGVmZXJyZWRBdWRpb1NlZWsgPSBmYWxzZTsKIAorICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGludDY0X3QgcG9zaXRpb247CisgICAgICAgIGdldFBvc2l0aW9uKCZwb3NpdGlvbik7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBQbGF5YmFjazo6U1RBUlQsIHBvc2l0aW9uIC8gMTAwMCk7CisgICAgfQorCiAgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewpAQCAtNzc5LDYgKzgwMCwxMSBAQAogCiAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+KFBMQVlJTkcgfCBGSVJTVF9GUkFNRSk7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrOjpTVE9QLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICAgICAgfQogCkBAIC05MDYsNiArOTMyLDExIEBACiAKICAgICBtRmxhZ3MgJj0gflBMQVlJTkc7CiAKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEwMjMsNiArMTA1NCwxMyBAQAogICAgICAgICBtV2F0Y2hGb3JBdWRpb1NlZWtDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgIG1XYXRjaEZvckF1ZGlvRU9TID0gdHJ1ZTsKICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7CisKKyAgICAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2s6OlBBVVNFLCAwKTsKKyAgICAgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgUGxheWJhY2s6OlNUQVJULCBtU2Vla1RpbWVVcyAvIDEwMDApOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xMjU1LDYgKzEyOTMsMTMgQEAKIAogICAgIFRpbWVTb3VyY2UgKnRzID0gKG1GbGFncyAmIEFVRElPX0FUX0VPUykgPyAmbVN5c3RlbVRpbWVTb3VyY2UgOiBtVGltZVNvdXJjZTsKIAorICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5zZXRQbGF5YmFja1N0YXR1cyhtRGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBQbGF5YmFjazo6UEFVU0UsIDApOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMobURlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgUGxheWJhY2s6OlNUQVJULCB0aW1lVXMgLyAxMDAwKTsKKyAgICB9CisKICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKICAgICAgICAgbUZsYWdzICY9IH5GSVJTVF9GUkFNRTsKIApAQCAtMTYzOCw2ICsxNjgzLDEyIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGRhdGFTb3VyY2UtPmdldERybUluZm8oJm1EZWNyeXB0SGFuZGxlLCAmbURybU1hbmFnZXJDbGllbnQpOworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMCisgICAgICAgICAgICAmJiBSaWdodHNTdGF0dXM6OlJJR0hUU19WQUxJRCAhPSBtRGVjcnlwdEhhbmRsZS0+c3RhdHVzKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIEVSUk9SX05PX0xJQ0VOU0UpOworICAgIH0KKwogICAgIHJldHVybiBzZXREYXRhU291cmNlX2woZXh0cmFjdG9yKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRFJNRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5YWQyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RSTUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJpbmNsdWRlL0FNUkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTVAzRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvV0FWRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKworI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRHJtTWFuYWdlckNsaWVudCogZ0RybU1hbmFnZXJDbGllbnQgPSBOVUxMOworCitjbGFzcyBEUk1Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworcHVibGljOgorICAgIERSTVNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJm1lZGlhU291cmNlLAorICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50MzJfdCB0cmFja0lkLCBEcm1CdWZmZXIqIGlwbXBCb3gpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EUk1Tb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbU9yaWdpbmFsTWVkaWFTb3VyY2U7CisgICAgRGVjcnlwdEhhbmRsZSogbURlY3J5cHRIYW5kbGU7CisgICAgc2l6ZV90IG1UcmFja0lkOworICAgIG11dGFibGUgTXV0ZXggbURSTUxvY2s7CisgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOworICAgIGJvb2wgbVdhbnRzTkFMRnJhZ21lbnRzOworCisgICAgRFJNU291cmNlKGNvbnN0IERSTVNvdXJjZSAmKTsKKyAgICBEUk1Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEUk1Tb3VyY2UgJik7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitEUk1Tb3VyY2U6OkRSTVNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJm1lZGlhU291cmNlLAorICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQzMl90IHRyYWNrSWQsIERybUJ1ZmZlciogaXBtcEJveCkKKyAgICA6IG1PcmlnaW5hbE1lZGlhU291cmNlKG1lZGlhU291cmNlKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKGRlY3J5cHRIYW5kbGUpLAorICAgICAgbVRyYWNrSWQodHJhY2tJZCksCisgICAgICBtTkFMTGVuZ3RoU2l6ZSgwKSwKKyAgICAgIG1XYW50c05BTEZyYWdtZW50cyhmYWxzZSkgeworICAgIGdEcm1NYW5hZ2VyQ2xpZW50LT5pbml0aWFsaXplRGVjcnlwdFVuaXQoCisgICAgICAgICAgICBtRGVjcnlwdEhhbmRsZSwgdHJhY2tJZCwgaXBtcEJveCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIGJvb2wgc3VjY2VzcyA9IGdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBDSEVDSyhnZXRGb3JtYXQoKS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgQ0hFQ0soc2l6ZSA+PSA3KTsKKyAgICAgICAgQ0hFQ0tfRVEocHRyWzBdLCAxKTsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KKyAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOworICAgIH0KK30KKworRFJNU291cmNlOjp+RFJNU291cmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRFJNTG9jayk7CisgICAgZ0RybU1hbmFnZXJDbGllbnQtPmZpbmFsaXplRGVjcnlwdFVuaXQobURlY3J5cHRIYW5kbGUsIG1UcmFja0lkKTsKK30KKworc3RhdHVzX3QgRFJNU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaW50MzJfdCB2YWw7CisgICAgaWYgKHBhcmFtcyAmJiBwYXJhbXMtPmZpbmRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsICZ2YWwpCisgICAgICAgICYmIHZhbCAhPSAwKSB7CisgICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gZmFsc2U7CisgICAgfQorCisgICByZXR1cm4gbU9yaWdpbmFsTWVkaWFTb3VyY2UtPnN0YXJ0KHBhcmFtcyk7Cit9CisKK3N0YXR1c190IERSTVNvdXJjZTo6c3RvcCgpIHsKKyAgICByZXR1cm4gbU9yaWdpbmFsTWVkaWFTb3VyY2UtPnN0b3AoKTsKK30KKworc3A8TWV0YURhdGE+IERSTVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtT3JpZ2luYWxNZWRpYVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3N0YXR1c190IERSTVNvdXJjZTo6cmVhZChNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURSTUxvY2spOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IG1PcmlnaW5hbE1lZGlhU291cmNlLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucykpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc2l6ZV90IGxlbiA9ICgqYnVmZmVyKS0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBjaGFyICpzcmMgPSAoY2hhciAqKSgqYnVmZmVyKS0+ZGF0YSgpICsgKCpidWZmZXIpLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIERybUJ1ZmZlciBlbmNyeXB0ZWREcm1CdWZmZXIoc3JjLCBsZW4pOworICAgIERybUJ1ZmZlciBkZWNyeXB0ZWREcm1CdWZmZXI7CisgICAgZGVjcnlwdGVkRHJtQnVmZmVyLmxlbmd0aCA9IGxlbjsKKyAgICBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSA9IG5ldyBjaGFyW2xlbl07CisgICAgRHJtQnVmZmVyICpwRGVjcnlwdGVkRHJtQnVmZmVyID0gJmRlY3J5cHRlZERybUJ1ZmZlcjsKKworICAgIGlmICgoZXJyID0gZ0RybU1hbmFnZXJDbGllbnQtPmRlY3J5cHQobURlY3J5cHRIYW5kbGUsIG1UcmFja0lkLAorICAgICAgICAgICAgJmVuY3J5cHRlZERybUJ1ZmZlciwgJnBEZWNyeXB0ZWREcm1CdWZmZXIpKSAhPSBEUk1fTk9fRVJST1IpIHsKKworICAgICAgICBpZiAoZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YTsKKyAgICAgICAgICAgIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgPT0gRFJNX0VSUk9SX0xJQ0VOU0VfRVhQSVJFRCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PX0xJQ0VOU0U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0socERlY3J5cHRlZERybUJ1ZmZlciA9PSAmZGVjcnlwdGVkRHJtQnVmZmVyKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0soZ2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpICYmICFtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90KilzcmM7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICBsZW4gPSBkZWNyeXB0ZWREcm1CdWZmZXIubGVuZ3RoOworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgbGVuKSB7CisgICAgICAgICAgICBDSEVDSyhzcmNPZmZzZXQgKyBtTkFMTGVuZ3RoU2l6ZSA8PSBsZW4pOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhID0gKGNvbnN0IHVpbnQ4X3QqKSgmZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGFbc3JjT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIHN3aXRjaCAobU5BTExlbmd0aFNpemUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9ICpkYXRhOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IFUxNl9BVChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSAoKHNpemVfdClkYXRhWzBdIDw8IDE2KSB8IFUxNl9BVCgmZGF0YVsxXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gVTMyX0FUKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKworICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbExlbmd0aCA+IGxlbikgeworICAgICAgICAgICAgICAgIGlmIChkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgW10gZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soZHN0T2Zmc2V0ICsgNCA8PSAoKmJ1ZmZlciktPnNpemUoKSk7CisKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGFbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBsZW4pOworICAgICAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgoKmJ1ZmZlciktPnJhbmdlX29mZnNldCgpLCBkc3RPZmZzZXQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHNyYywgZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEsIGRlY3J5cHRlZERybUJ1ZmZlci5sZW5ndGgpOworICAgICAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgoKmJ1ZmZlciktPnJhbmdlX29mZnNldCgpLCBkZWNyeXB0ZWREcm1CdWZmZXIubGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAoZGVjcnlwdGVkRHJtQnVmZmVyLmRhdGEpIHsKKyAgICAgICAgZGVsZXRlIFtdIGRlY3J5cHRlZERybUJ1ZmZlci5kYXRhOworICAgICAgICBkZWNyeXB0ZWREcm1CdWZmZXIuZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitEUk1FeHRyYWN0b3I6OkRSTUV4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyKiBtaW1lKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpIHsKKyAgICBtT3JpZ2luYWxFeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKHNvdXJjZSwgbWltZSk7CisgICAgbU9yaWdpbmFsRXh0cmFjdG9yLT5zZXREcm1GbGFnKHRydWUpOworCisgICAgRHJtTWFuYWdlckNsaWVudCAqY2xpZW50OworICAgIHNvdXJjZS0+Z2V0RHJtSW5mbygmbURlY3J5cHRIYW5kbGUsICZjbGllbnQpOworfQorCitEUk1FeHRyYWN0b3I6On5EUk1FeHRyYWN0b3IoKSB7Cit9CisKK3NpemVfdCBEUk1FeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBtT3JpZ2luYWxFeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBEUk1FeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIHNwPE1lZGlhU291cmNlPiBvcmlnaW5hbE1lZGlhU291cmNlID0gbU9yaWdpbmFsRXh0cmFjdG9yLT5nZXRUcmFjayhpbmRleCk7CisgICAgb3JpZ2luYWxNZWRpYVNvdXJjZS0+Z2V0Rm9ybWF0KCktPnNldEludDMyKGtLZXlJc0RSTSwgMSk7CisKKyAgICBpbnQzMl90IHRyYWNrSUQ7CisgICAgQ0hFQ0soZ2V0VHJhY2tNZXRhRGF0YShpbmRleCwgMCktPmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSUQpKTsKKworICAgIERybUJ1ZmZlciBpcG1wQm94OworICAgIGlwbXBCb3guZGF0YSA9IG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0RHJtVHJhY2tJbmZvKHRyYWNrSUQsICYoaXBtcEJveC5sZW5ndGgpKTsKKyAgICBDSEVDSyhpcG1wQm94Lmxlbmd0aCA+IDApOworCisgICAgcmV0dXJuIG5ldyBEUk1Tb3VyY2Uob3JpZ2luYWxNZWRpYVNvdXJjZSwgbURlY3J5cHRIYW5kbGUsIHRyYWNrSUQsICZpcG1wQm94KTsKK30KKworc3A8TWV0YURhdGE+IERSTUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIG1PcmlnaW5hbEV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpbmRleCwgZmxhZ3MpOworfQorCitzcDxNZXRhRGF0YT4gRFJNRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSgpIHsKKyAgICByZXR1cm4gbU9yaWdpbmFsRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworfQorCitzdGF0aWMgTXV0ZXggZ0RSTVNuaWZmZXJNdXRleDsKK2Jvb2wgU25pZmZEUk0oCisgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdEUk1TbmlmZmVyTXV0ZXgpOworICAgICAgICBpZiAoZ0RybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgZ0RybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgRGVjcnlwdEhhbmRsZSAqZGVjcnlwdEhhbmRsZSA9IHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24oZ0RybU1hbmFnZXJDbGllbnQpOworCisgICAgaWYgKGRlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPT0gRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRCkgeworICAgICAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOCgiZHJtK2NvbnRhaW5lcl9iYXNlZCsiKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9PSBEZWNyeXB0QXBpVHlwZTo6RUxFTUVOVEFSWV9TVFJFQU1fQkFTRUQpIHsKKyAgICAgICAgICAgICptaW1lVHlwZSA9IFN0cmluZzgoImRybStlc19iYXNlZCsiKTsKKyAgICAgICAgfQorCisgICAgICAgICptaW1lVHlwZSArPSBkZWNyeXB0SGFuZGxlLT5taW1lVHlwZTsKKyAgICAgICAgKmNvbmZpZGVuY2UgPSAxMC4wZjsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9Cit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCA0OWVhYzYyLi4wYjg5OTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKQEAgLTMxLDYgKzMyLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYm9vbCBEYXRhU291cmNlOjpnZXRVSW50MTYob2ZmX3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCkgewpAQCAtMTA0LDYgKzEwNywxMiBAQAogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZkFNUik7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTVBFRzJUUyk7CiAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTVAzKTsKKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJkcm0uc2VydmljZS5lbmFibGVkIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpIHsKKyAgICAgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmRFJNKTsKKyAgICB9CiB9CiAKIC8vIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBkZDI1NzliLi5iNDZkOGQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMjEsMTQgKzIxLDI2IEBACiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCiAgICAgOiBtRmlsZShmb3BlbihmaWxlbmFtZSwgInJiIikpLAorICAgICAgbUZkKGZpbGVubyhtRmlsZSkpLAogICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1MZW5ndGgoLTEpIHsKKyAgICAgIG1MZW5ndGgoLTEpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCisgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKKyAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCisgICAgICBtRHJtQnVmU2l6ZSgwKSwKKyAgICAgIG1Ecm1CdWYoTlVMTCl7CiB9CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiAgICAgOiBtRmlsZShmZG9wZW4oZmQsICJyYiIpKSwKKyAgICAgIG1GZChmZCksCiAgICAgICBtT2Zmc2V0KG9mZnNldCksCi0gICAgICBtTGVuZ3RoKGxlbmd0aCkgeworICAgICAgbUxlbmd0aChsZW5ndGgpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCisgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKKyAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCisgICAgICBtRHJtQnVmU2l6ZSgwKSwKKyAgICAgIG1Ecm1CdWYoTlVMTCl7CiAgICAgQ0hFQ0sob2Zmc2V0ID49IDApOwogICAgIENIRUNLKGxlbmd0aCA+PSAwKTsKIH0KQEAgLTM4LDYgKzUwLDE0IEBACiAgICAgICAgIGZjbG9zZShtRmlsZSk7CiAgICAgICAgIG1GaWxlID0gTlVMTDsKICAgICB9CisKKyAgICBpZiAobURybUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZVtdIG1Ecm1CdWY7CisgICAgICAgIG1Ecm1CdWYgPSBOVUxMOworICAgIH0KKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgfQogfQogCiBzdGF0dXNfdCBGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CkBAIC02MSwxMyArODEsMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludCBlcnIgPSBmc2Vla28obUZpbGUsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgb2Zmc2V0ICsgbU9mZnNldCk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KKyAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCAmJiBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECisgICAgICAgICAgICA9PSBtRGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRBdERSTShvZmZzZXQsIGRhdGEsIHNpemUpOworICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGVyciA9IGZzZWVrbyhtRmlsZSwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIG9mZnNldCArIG1PZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KIAotICAgIHJldHVybiBmcmVhZChkYXRhLCAxLCBzaXplLCBtRmlsZSk7CisgICAgICAgIHJldHVybiBmcmVhZChkYXRhLCAxLCBzaXplLCBtRmlsZSk7CisgICAgfQogfQogCiBzdGF0dXNfdCBGaWxlU291cmNlOjpnZXRTaXplKG9mZl90ICpzaXplKSB7CkBAIC04Nyw0ICsxMTIsNTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK0RlY3J5cHRIYW5kbGUqIEZpbGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKERybU1hbmFnZXJDbGllbnQqIGNsaWVudCkgeworICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gY2xpZW50OworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICBtRmQsIG1PZmZzZXQsIG1MZW5ndGgpOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Cit9CisKK3ZvaWQgRmlsZVNvdXJjZTo6Z2V0RHJtSW5mbyhEZWNyeXB0SGFuZGxlICoqaGFuZGxlLCBEcm1NYW5hZ2VyQ2xpZW50ICoqY2xpZW50KSB7CisgICAgKmhhbmRsZSA9IG1EZWNyeXB0SGFuZGxlOworCisgICAgKmNsaWVudCA9IG1Ecm1NYW5hZ2VyQ2xpZW50OworfQorCitzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTShvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKKyAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07CisgICAgfQorCisgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCAmJiBtRHJtQnVmU2l6ZSA+IDAgJiYgKG9mZnNldCArIG1PZmZzZXQpID49IG1Ecm1CdWZPZmZzZXQKKyAgICAgICAgICAgICYmIChvZmZzZXQgKyBtT2Zmc2V0ICsgc2l6ZSkgPD0gKG1Ecm1CdWZPZmZzZXQgKyBtRHJtQnVmU2l6ZSkpIHsKKyAgICAgICAgLyogVXNlIGJ1ZmZlcmVkIGRhdGEgKi8KKyAgICAgICAgbWVtY3B5KGRhdGEsICh2b2lkKikobURybUJ1Zisob2Zmc2V0K21PZmZzZXQtbURybUJ1Zk9mZnNldCkpLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfSBlbHNlIGlmIChzaXplIDw9IERSTV9DQUNIRV9TSVpFKSB7CisgICAgICAgIC8qIEJ1ZmZlciBuZXcgZGF0YSAqLworICAgICAgICBtRHJtQnVmT2Zmc2V0ID0gIG9mZnNldCArIG1PZmZzZXQ7CisgICAgICAgIG1Ecm1CdWZTaXplID0gbURybU1hbmFnZXJDbGllbnQtPnByZWFkKG1EZWNyeXB0SGFuZGxlLCBtRHJtQnVmLAorICAgICAgICAgICAgICAgIERSTV9DQUNIRV9TSVpFLCBvZmZzZXQgKyBtT2Zmc2V0KTsKKyAgICAgICAgaWYgKG1Ecm1CdWZTaXplID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBkYXRhUmVhZCA9IDA7CisgICAgICAgICAgICBkYXRhUmVhZCA9IHNpemUgPiBtRHJtQnVmU2l6ZSA/IG1Ecm1CdWZTaXplIDogc2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCAodm9pZCopbURybUJ1ZiwgZGF0YVJlYWQpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFSZWFkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG1Ecm1CdWZTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVG9vIGJpZyBjaHVuayB0byBjYWNoZS4gQ2FsbCBEUk0gZGlyZWN0bHkgKi8KKyAgICAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyQ2xpZW50LT5wcmVhZChtRGVjcnlwdEhhbmRsZSwgZGF0YSwgc2l6ZSwgb2Zmc2V0ICsgbU9mZnNldCk7CisgICAgfQorfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAppbmRleCAzNDA2NGM4Li41NDk3MzIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNjQsNyArMjY0LDkgQEAKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCksCi0gICAgICBtRmlsZU1ldGFEYXRhKG5ldyBNZXRhRGF0YSkgeworICAgICAgbUZpbGVNZXRhRGF0YShuZXcgTWV0YURhdGEpLAorICAgICAgbUZpcnN0U0lORihOVUxMKSwKKyAgICAgIG1Jc0RybShmYWxzZSkgewogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewpAQCAtMjc2LDYgKzI3OCwxNSBAQAogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQogICAgIG1GaXJzdFRyYWNrID0gbUxhc3RUcmFjayA9IE5VTEw7CisKKyAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICB3aGlsZSAoc2luZikgeworICAgICAgICBTSU5GICpuZXh0ID0gc2luZi0+bmV4dDsKKyAgICAgICAgZGVsZXRlIHNpbmYtPklQTVBEYXRhOworICAgICAgICBkZWxldGUgc2luZjsKKyAgICAgICAgc2luZiA9IG5leHQ7CisgICAgfQorICAgIG1GaXJzdFNJTkYgPSBOVUxMOwogfQogCiBzcDxNZXRhRGF0YT4gTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgewpAQCAtMzcwLDYgKzM4MSwxNzggQEAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIE1QRUc0RXh0cmFjdG9yOjpzZXREcm1GbGFnKGJvb2wgZmxhZykgeworICAgIG1Jc0RybSA9IGZsYWc7Cit9CisKK2NoYXIqIE1QRUc0RXh0cmFjdG9yOjpnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKSB7CisgICAgaWYgKG1GaXJzdFNJTkYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICB3aGlsZSAoc2luZiAmJiAodHJhY2tJRCAhPSBzaW5mLT50cmFja0lEKSkgeworICAgICAgICBzaW5mID0gc2luZi0+bmV4dDsKKyAgICB9CisKKyAgICBpZiAoc2luZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICpsZW4gPSBzaW5mLT5sZW47CisgICAgcmV0dXJuIHNpbmYtPklQTVBEYXRhOworfQorCisvLyBSZWFkcyBhbiBlbmNvZGVkIGludGVnZXIgNyBiaXRzIGF0IGEgdGltZSB1bnRpbCBpdCBlbmNvdW50ZXJzIHRoZSBoaWdoIGJpdCBjbGVhci4KK2ludDMyX3QgcmVhZFNpemUob2ZmX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiBEYXRhU291cmNlLCB1aW50OF90ICpudW1PZkJ5dGVzKSB7CisgICAgdWludDMyX3Qgc2l6ZSA9IDA7CisgICAgdWludDhfdCBkYXRhOworICAgIGJvb2wgbW9yZURhdGEgPSB0cnVlOworICAgICpudW1PZkJ5dGVzID0gMDsKKworICAgIHdoaWxlIChtb3JlRGF0YSkgeworICAgICAgICBpZiAoRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmRhdGEsIDEpIDwgMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9mZnNldCArKzsKKyAgICAgICAgbW9yZURhdGEgPSAoZGF0YSA+PSAxMjgpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBzaXplID0gKHNpemUgPDwgNykgfCAoZGF0YSAmIDB4N2YpOyAvLyBUYWtlIGxhc3QgNyBiaXRzCisgICAgICAgICgqbnVtT2ZCeXRlcykgKys7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZURybVNJTkYob2ZmX3QgKm9mZnNldCwgb2ZmX3QgZGF0YV9vZmZzZXQpIHsKKyAgICB1aW50OF90IHVwZGF0ZUlkVGFnOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmdXBkYXRlSWRUYWcsIDEpIDwgMSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGRhdGFfb2Zmc2V0ICsrOworCisgICAgaWYgKDB4MDEvKk9CSkVDVF9ERVNDUklQVE9SX1VQREFURV9JRF9UQUcqLyAhPSB1cGRhdGVJZFRhZykgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQ4X3QgbnVtT2ZCeXRlczsKKyAgICBpbnQzMl90IHNpemUgPSByZWFkU2l6ZShkYXRhX29mZnNldCwgbURhdGFTb3VyY2UsICZudW1PZkJ5dGVzKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICBpbnQzMl90IGNsYXNzU2l6ZSA9IHNpemU7CisgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKKworICAgIHdoaWxlKHNpemUgPj0gMTEgKSB7CisgICAgICAgIHVpbnQ4X3QgZGVzY3JpcHRvclRhZzsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZkZXNjcmlwdG9yVGFnLCAxKSA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArKzsKKworICAgICAgICBpZiAoMHgxMS8qT0JKRUNUX0RFU0NSSVBUT1JfSURfVEFHKi8gIT0gZGVzY3JpcHRvclRhZykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOworICAgICAgICAvL09iamVjdERlc2NyaXB0b3JJRCBhbmQgT2JqZWN0RGVzY3JpcHRvciB1cmwgZmxhZworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgYnVmZmVyLCAyKSA8IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBkYXRhX29mZnNldCArPSAyOworCisgICAgICAgIGlmICgoYnVmZmVyWzFdID4+IDUpICYgMHgwMDAxKSB7IC8vdXJsIGZsYWcgaXMgc2V0CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIGJ1ZmZlciwgOCkgPCA4KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9vZmZzZXQgKz0gODsKKworICAgICAgICBpZiAoKDB4MEYvKkVTX0lEX1JFRl9UQUcqLyAhPSBidWZmZXJbMV0pCisgICAgICAgICAgICAgICAgfHwgKCAweDBBLypJUE1QX0RFU0NSSVBUT1JfUE9JTlRFUl9JRF9UQUcqLyAhPSBidWZmZXJbNV0pKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgU0lORiAqc2luZiA9IG5ldyBTSU5GOworICAgICAgICBzaW5mLT50cmFja0lEID0gVTE2X0FUKCZidWZmZXJbM10pOworICAgICAgICBzaW5mLT5JUE1QRGVzY3JpcHRvcklEID0gYnVmZmVyWzddOworICAgICAgICBzaW5mLT5uZXh0ID0gbUZpcnN0U0lORjsKKyAgICAgICAgbUZpcnN0U0lORiA9IHNpbmY7CisKKyAgICAgICAgc2l6ZSAtPSAoOCArIDIgKyAxKTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsICZ1cGRhdGVJZFRhZywgMSkgPCAxKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICBpZigweDA1LypJUE1QX0RFU0NSSVBUT1JfVVBEQVRFX0lEX1RBRyovICE9IHVwZGF0ZUlkVGFnKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc2l6ZSA9IHJlYWRTaXplKGRhdGFfb2Zmc2V0LCBtRGF0YVNvdXJjZSwgJm51bU9mQnl0ZXMpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorICAgIGNsYXNzU2l6ZSA9IHNpemU7CisgICAgZGF0YV9vZmZzZXQgKz0gbnVtT2ZCeXRlczsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICB1aW50OF90IHRhZzsKKyAgICAgICAgaW50MzJfdCBkYXRhTGVuOworICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChkYXRhX29mZnNldCwgJnRhZywgMSkgPCAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9vZmZzZXQgKys7CisKKyAgICAgICAgaWYgKDB4MEIvKklQTVBfREVTQ1JJUFRPUl9JRF9UQUcqLyA9PSB0YWcpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaWQ7CisgICAgICAgICAgICBkYXRhTGVuID0gcmVhZFNpemUoZGF0YV9vZmZzZXQsIG1EYXRhU291cmNlLCAmbnVtT2ZCeXRlcyk7CisgICAgICAgICAgICBpZiAoZGF0YUxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFMZW4gPCA0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IG51bU9mQnl0ZXM7CisKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCAmaWQsIDEpIDwgMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsrOworCisgICAgICAgICAgICBTSU5GICpzaW5mID0gbUZpcnN0U0lORjsKKyAgICAgICAgICAgIHdoaWxlIChzaW5mICYmIChzaW5mLT5JUE1QRGVzY3JpcHRvcklEICE9IGlkKSkgeworICAgICAgICAgICAgICAgIHNpbmYgPSBzaW5mLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbmYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaW5mLT5sZW4gPSBkYXRhTGVuIC0gMzsKKyAgICAgICAgICAgIHNpbmYtPklQTVBEYXRhID0gbmV3IGNoYXJbc2luZi0+bGVuXTsKKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQgKyAyLCBzaW5mLT5JUE1QRGF0YSwgc2luZi0+bGVuKSA8IHNpbmYtPmxlbikgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpbmYtPmxlbjsKKworICAgICAgICAgICAgc2l6ZSAtPSAoZGF0YUxlbiArIG51bU9mQnl0ZXMgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorfQorCiBzdGF0aWMgdm9pZCBNYWtlRm91ckNDU3RyaW5nKHVpbnQzMl90IHgsIGNoYXIgKnMpIHsKICAgICBzWzBdID0geCA+PiAyNDsKICAgICBzWzFdID0gKHggPj4gMTYpICYgMHhmZjsKQEAgLTU3Miw3ICs3NTUsMTEgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSkgewogICAgICAgICAgICAgICAgIG1IYXZlTWV0YWRhdGEgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBkdW1teSBlcnJvci4KKyAgICAgICAgICAgICAgICBpZiAoIW1Jc0RybSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTAyMCw2ICsxMjA3LDIwIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbUlzRHJtKSB7CisgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcGFyc2VEcm1TSU5GKG9mZnNldCwgZGF0YV9vZmZzZXQpOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMTA2OSw2ICsxMjcwLDggQEAKICAgICAgICAgZHVyYXRpb24gPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwogICAgIH0KIAorICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CiAgICAgaW50MzJfdCBhMDEgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXQgKyA0XSk7CkBAIC0xNzEyLDkgKzE5MTUsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CiAgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLQotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KLSAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIGludDMyX3QgZHJtID0gMDsKKyAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKKyAgICAgICAgaWYgKHVzZXNEUk0pIHsKKyAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgKHVpbnQ4X3QqKW1CdWZmZXItPmRhdGEoKSwgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtU3JjQnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKQEAgLTE3MjMsNDAgKzE5MzIsNDYgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICBpZiAodXNlc0RSTSkgeworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKIAotICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgQ0hFQ0soc3JjT2Zmc2V0ICsgbU5BTExlbmd0aFNpemUgPD0gc2l6ZSk7Ci0gICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICAgICAgaWYgKHNyY09mZnNldCArIG5hbExlbmd0aCA+IHNpemUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgICAgIENIRUNLKHNyY09mZnNldCArIG1OQUxMZW5ndGhTaXplIDw9IHNpemUpOworICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICBpZiAoc3JjT2Zmc2V0ICsgbmFsTGVuZ3RoID4gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENIRUNLKGRzdE9mZnNldCArIDQgPD0gbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDSEVDSyhkc3RPZmZzZXQgKyA0IDw9IG1CdWZmZXItPnNpemUoKSk7Ci0KLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwogICAgICAgICB9Ci0gICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CiAKLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CiAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5jbGVhcigpOwogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdClkdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDhhNWZiMTEuLjk2NWMzNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgIm1hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmgiCiAKQEAgLTYzLDYgKzY0LDE4IEBACiAgICAgICAgICAgICAgbWltZSwgY29uZmlkZW5jZSk7CiAgICAgfQogCisgICAgaWYgKCFzdHJuY21wKG1pbWUsICJkcm0iLCAzKSkgeworICAgICAgICBjb25zdCBjaGFyICpvcmlnaW5hbE1pbWUgPSBzdHJyY2hyKG1pbWUsICcrJykgKyAxOworCisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiZHJtK2VzX2Jhc2VkIiwgMTIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERSTUV4dHJhY3Rvcihzb3VyY2UsIG9yaWdpbmFsTWltZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZSwgImRybStjb250YWluZXJfYmFzZWQiLCAxOSkpIHsKKyAgICAgICAgICAgIG1pbWUgPSBvcmlnaW5hbE1pbWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCAiYXVkaW8vbXA0IikpIHsKICAgICAgICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAppbmRleCA2YmY2OTc5Li4wNGNjYTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwYXRoLT5zZXRUbyhzbGFzaFBvcyk7CiAgICAgfQogCi0gICAgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CisgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIoaG9zdC0+c3RyaW5nKCksICc6Jyk7CiAKICAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgewogICAgICAgICB1bnNpZ25lZCBsb25nIHg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggMTBjNmU0MS4uN2E2MDBkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMTI3LDEwICsxMjcsMTEgQEAKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5ydHR0bCIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChleHRlbnNpb24sICIucnR4IikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5vdGEiKSkgewotICAgICAgICByZXR1cm4gSGFuZGxlTUlESShwYXRoLCAmY2xpZW50KTsKLSAgICB9Ci0KLSAgICBpZiAobVJldHJpZXZlci0+c2V0RGF0YVNvdXJjZShwYXRoKSA9PSBPSykgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBIYW5kbGVNSURJKHBhdGgsICZjbGllbnQpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHBhdGgpID09IE9LKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwogICAgICAgICBpZiAoKHZhbHVlID0gbVJldHJpZXZlci0+ZXh0cmFjdE1ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX01JTUVUWVBFKSkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggYTY4YzY0MS4uOTBmM2Q2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnNsYXNoUG9zID0gc3RycmNocihiYXNlVVJMLCAnLycpOwogCiAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CiAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IGMwNTllNjAuLmUzNTI5MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVGltZVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDYgKzQyLDkgQEAKIHN0cnVjdCBBUlRQU2Vzc2lvbjsKIHN0cnVjdCBVRFBQdXNoZXI7CiAKK2NsYXNzIERybU1hbmFnZXJDbGluZXQ7CitjbGFzcyBEZWNyeXB0SGFuZGxlOworCiBzdHJ1Y3QgQXdlc29tZVJlbmRlcmVyIDogcHVibGljIFJlZkJhc2UgewogICAgIEF3ZXNvbWVSZW5kZXJlcigpIHt9CiAKQEAgLTIxNiw2ICsyMjAsOSBAQAogICAgICAgICB9CiAgICAgfSAqbVN1c3BlbnNpb25TdGF0ZTsKIAorICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIERlY3J5cHRIYW5kbGUgKm1EZWNyeXB0SGFuZGxlOworCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZV9sKAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRFJNRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmM4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0RSTUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9FWFRSQUNUT1JfSF8KKworI2RlZmluZSBEUk1fRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIFNhbXBsZVRhYmxlOworY2xhc3MgU3RyaW5nODsKK2NsYXNzIERlY3J5cHRIYW5kbGU7CisKK2NsYXNzIERSTUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitwdWJsaWM6CisgICAgRFJNRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpOworCisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKKyAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0TWV0YURhdGEoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRSTUV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworCisgICAgc3A8TWVkaWFFeHRyYWN0b3I+IG1PcmlnaW5hbEV4dHJhY3RvcjsKKyAgICBEZWNyeXB0SGFuZGxlKiBtRGVjcnlwdEhhbmRsZTsKKworICAgIERSTUV4dHJhY3Rvcihjb25zdCBEUk1FeHRyYWN0b3IgJik7CisgICAgRFJNRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgRFJNRXh0cmFjdG9yICYpOworfTsKKworYm9vbCBTbmlmZkRSTSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+ICopOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9FWFRSQUNUT1JfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDI2MTBiMGUuLmJjMmU0ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTM5LDYgKzM5LDEwIEBACiAKICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRNZXRhRGF0YSgpOwogCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgdm9pZCBzZXREcm1GbGFnKGJvb2wgZmxhZyk7CisgICAgdmlydHVhbCBjaGFyKiBnZXREcm1UcmFja0luZm8oc2l6ZV90IHRyYWNrSUQsIGludCAqbGVuKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1QRUc0RXh0cmFjdG9yKCk7CiAKQEAgLTcxLDYgKzc1LDE5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgdmVyaWZ5VHJhY2soVHJhY2sgKnRyYWNrKTsKIAorICAgIHN0cnVjdCBTSU5GIHsKKyAgICAgICAgU0lORiAqbmV4dDsKKyAgICAgICAgdWludDE2X3QgdHJhY2tJRDsKKyAgICAgICAgdWludDhfdCBJUE1QRGVzY3JpcHRvcklEOworICAgICAgICBzc2l6ZV90IGxlbjsKKyAgICAgICAgY2hhciAqSVBNUERhdGE7CisgICAgfTsKKworICAgIFNJTkYgKm1GaXJzdFNJTkY7CisKKyAgICBib29sIG1Jc0RybTsKKyAgICBzdGF0dXNfdCBwYXJzZURybVNJTkYob2ZmX3QgKm9mZnNldCwgb2ZmX3QgZGF0YV9vZmZzZXQpOworCiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0hlYWRlcihvZmZfdCBkYXRhX29mZnNldCwgb2ZmX3QgZGF0YV9zaXplKTsKIAogICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKaW5kZXggMGQwMjM0Yi4uNzc5MTdiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICBBU3RyaW5nIGZvcm1hdDsKICAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOwogCi0gICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBjb25zdCBjaGFyICpsYXN0U3BhY2VQb3MgPSBzdHJyY2hyKGZvcm1hdC5jX3N0cigpLCAnICcpOwogICAgIENIRUNLKGxhc3RTcGFjZVBvcyAhPSBOVUxMKTsKIAogICAgIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IDhmOGUxMGEuLjliYjhjNDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMTEzMSw3ICsxMTMxLDcgQEAKICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CiAgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKIAogICAgICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKICAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7Cg==