ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4NGQ3YwotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsOTYgQEAKKyogdGV4dD1hdXRvICFlb2wgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmdpdGF0dHJpYnV0ZXMgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKworIyBTY3JpcHRpc2ggZm9ybWF0cworKi5iYXQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmJzaCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1iZWFuc2hlbGwKKyouY2dpICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5jbWQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmpzICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvamF2YXNjcmlwdAorKi5waHAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3gtcGhwCisqLnBsICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1wZXJsCisqLnBtICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1wZXJsCisqLnB5ICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveC1weXRob24KKyouc2ggICAgICAgICBlb2w9bGYgc3ZuZW9sPUxGI3RleHQveC1zaAorY29uZmlndXJlICAgIGVvbD1sZiBzdm5lb2w9TEYjdGV4dC94LXNoCisKKyMgSW1hZ2UgZm9ybWF0cworKi5ibXAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvYm1wCisqLmdpZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS9naWYKKyouaWNvICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2ltYWdlL2ljbworKi5qcGVnICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvanBlZworKi5qcGcgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvanBlZworKi5wbmcgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjaW1hZ2UvcG5nCisqLnRpZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS90aWZmCisqLnRpZmYgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNpbWFnZS90aWZmCisqLnN2ZyAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI2ltYWdlL3N2ZyUyQnhtbAorCisjIERhdGEgZm9ybWF0cworKi5wZGYgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcGRmCisqLmF2aSAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN2aWRlby9hdmkKKyouZG9jICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2FwcGxpY2F0aW9uL21zd29yZAorKi5kc3AgICAgICAgIHRleHQgc3ZuZW9sPWNybGYjdGV4dC9wbGFpbgorKi5kc3cgICAgICAgIHRleHQgc3ZuZW9sPWNybGYjdGV4dC9wbGFpbgorKi5lcHMgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcG9zdHNjcmlwdAorKi5neiAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vZ3ppcAorKi5tb3YgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjdmlkZW8vcXVpY2t0aW1lCisqLm1wMyAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhdWRpby9tcGVnCisqLnBwdCAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludAorKi5wcyAgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcG9zdHNjcmlwdAorKi5wc2QgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vcGhvdG9zaG9wCisqLnJkZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN0ZXh0L3JkZgorKi5yc3MgICAgICAgIHRleHQgc3ZuZW9sPXVuc2V0I3RleHQveG1sCisqLnJ0ZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCN0ZXh0L3J0ZgorKi5zbG4gICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnN3ZiAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaAorKi50Z3ogICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXBwbGljYXRpb24vZ3ppcAorKi52Y3Byb2ogICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi52Y3hwcm9qICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi52c3Byb3BzICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3htbAorKi53YXYgICAgICAgIGJpbmFyeSBzdm5lb2w9dW5zZXQjYXVkaW8vd2F2CisqLnhscyAgICAgICAgYmluYXJ5IHN2bmVvbD11bnNldCNhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwKKyouemlwICAgICAgICBiaW5hcnkgc3ZuZW9sPXVuc2V0I2FwcGxpY2F0aW9uL3ppcAorCisjIFRleHQgZm9ybWF0cworLmh0YWNjZXNzICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmJiayAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveG1sCisqLmNtYWtlICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouY3NzICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9jc3MKKyouZHRkICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyouaHRtICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9odG1sCisqLmh0bWwgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvaHRtbAorKi5pbmkgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmxvZyAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyoubWFrICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5xYmsgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnJzdCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouc3FsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94LXNxbAorKi50eHQgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLnhodG1sICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQveGh0bWwlMkJ4bWwKKyoueG1sICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNkICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHNsdCAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94bWwKKyoueHVsICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC94dWwKKyoueW1sICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorYm9vc3Qtbm8taW5zcGVjdCB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorQ0hBTkdFUyAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitDT1BZSU5HICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK0lOU1RBTEwgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorSmFtZmlsZSAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitKYW1yb290ICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK0phbWZpbGUudjIgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorSmFtcnVsZXMgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCitNYWtlZmlsZSogICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KK1JFQURNRSAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorVE9ETyAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisKKyMgQ29kZSBmb3JtYXRzCisqLmMgICAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouY3BwICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi5oICAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmhwcCAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouaXBwICAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgorKi50cHAgICAgICAgIHRleHQgc3ZuZW9sPW5hdGl2ZSN0ZXh0L3BsYWluCisqLmphbSAgICAgICAgdGV4dCBzdm5lb2w9bmF0aXZlI3RleHQvcGxhaW4KKyouamF2YSAgICAgICB0ZXh0IHN2bmVvbD1uYXRpdmUjdGV4dC9wbGFpbgpkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA0OGRiCi0tLSAvZGV2L251bGwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTAsMCArMSwyMDYgQEAKKyMgQ29weXJpZ2h0IDIwMTYsIDIwMTcgUGV0ZXIgRGltb3YKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly9ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCitsYW5ndWFnZTogY3BwCisKK3N1ZG86IGZhbHNlCisKK3B5dGhvbjogIjIuNyIKKworYnJhbmNoZXM6CisgIG9ubHk6CisgICAgLSBtYXN0ZXIKKyAgICAtIGRldmVsb3AKKyAgICAtIC9mZWF0dXJlXC8uKi8KKworZW52OgorICBtYXRyaXg6CisgICAgLSBCT0dVU19KT0I9dHJ1ZQorCittYXRyaXg6CisKKyAgZXhjbHVkZToKKyAgICAtIGVudjogQk9HVVNfSk9CPXRydWUKKworICBpbmNsdWRlOgorICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZysrCisgICAgICBlbnY6IFRPT0xTRVQ9Z2NjIENPTVBJTEVSPWcrKyBDWFhTVEQ9MDMsMTEKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZysrLTQuNworICAgICAgZW52OiBUT09MU0VUPWdjYyBDT01QSUxFUj1nKystNC43IENYWFNURD0wMywxMQorICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGcrKy00LjcKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorCisgICAgLSBvczogbGludXgKKyAgICAgIGNvbXBpbGVyOiBnKystNC44CisgICAgICBlbnY6IFRPT0xTRVQ9Z2NjIENPTVBJTEVSPWcrKy00LjggQ1hYU1REPTAzLDExCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTQuOAorICAgICAgICAgIHNvdXJjZXM6CisgICAgICAgICAgICAtIHVidW50dS10b29sY2hhaW4tci10ZXN0CisgICAgLSBvczogbGludXgKKyAgICAgIGNvbXBpbGVyOiBnKystNC45CisgICAgICBlbnY6IFRPT0xTRVQ9Z2NjIENPTVBJTEVSPWcrKy00LjkgQ1hYU1REPTAzLDExCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTQuOQorICAgICAgICAgIHNvdXJjZXM6CisgICAgICAgICAgICAtIHVidW50dS10b29sY2hhaW4tci10ZXN0CisKKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGcrKy01CisgICAgICBlbnY6IFRPT0xTRVQ9Z2NjIENPTVBJTEVSPWcrKy01IENYWFNURD0wMywxMSwxNCwxegorICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGcrKy01CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogZysrLTYKKyAgICAgIGVudjogVE9PTFNFVD1nY2MgQ09NUElMRVI9ZysrLTYgQ1hYU1REPTAzLDExLDE0LDF6CisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gZysrLTYKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorCisgICAgLSBvczogbGludXgKKyAgICAgIGRpc3Q6IHRydXN0eQorICAgICAgY29tcGlsZXI6IGcrKy03CisgICAgICBlbnY6IFRPT0xTRVQ9Z2NjIENPTVBJTEVSPWcrKy03IENYWFNURD0wMywxMSwxNCwxNworICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGcrKy03CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKworICAgICAgZW52OiBUT09MU0VUPWNsYW5nIENPTVBJTEVSPWNsYW5nKysgQ1hYU1REPTAzLDExCisKKyAgICAtIG9zOiBsaW51eAorICAgICAgY29tcGlsZXI6IGNsYW5nKystMy41CisgICAgICBlbnY6IFRPT0xTRVQ9Y2xhbmcgQ09NUElMRVI9Y2xhbmcrKy0zLjUgQ1hYU1REPTAzLDExCisgICAgICBhZGRvbnM6CisgICAgICAgIGFwdDoKKyAgICAgICAgICBwYWNrYWdlczoKKyAgICAgICAgICAgIC0gY2xhbmctMy41CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tcHJlY2lzZS0zLjUKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKy0zLjYKKyAgICAgIGVudjogVE9PTFNFVD1jbGFuZyBDT01QSUxFUj1jbGFuZysrLTMuNiBDWFhTVEQ9MDMsMTEsMTQsMXoKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy0zLjYKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTUtZGV2CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tcHJlY2lzZS0zLjYKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKy0zLjcKKyAgICAgIGVudjogVE9PTFNFVD1jbGFuZyBDT01QSUxFUj1jbGFuZysrLTMuNyBDWFhTVEQ9MDMsMTEsMTQsMXoKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy0zLjcKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTUtZGV2CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tcHJlY2lzZS0zLjcKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKy0zLjgKKyAgICAgIGVudjogVE9PTFNFVD1jbGFuZyBDT01QSUxFUj1jbGFuZysrLTMuOCBDWFhTVEQ9MDMsMTEsMTQsMXoKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy0zLjgKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTUtZGV2CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tcHJlY2lzZS0zLjgKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKy0zLjkKKyAgICAgIGVudjogVE9PTFNFVD1jbGFuZyBDT01QSUxFUj1jbGFuZysrLTMuOSBDWFhTVEQ9MDMsMTEsMTQsMXoKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy0zLjkKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTUtZGV2CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tcHJlY2lzZS0zLjkKKworICAgIC0gb3M6IGxpbnV4CisgICAgICBjb21waWxlcjogY2xhbmcrKy00LjAKKyAgICAgIGVudjogVE9PTFNFVD1jbGFuZyBDT01QSUxFUj1jbGFuZysrLTQuMCBDWFhTVEQ9MDMsMTEsMTQsMXoKKyAgICAgIGFkZG9uczoKKyAgICAgICAgYXB0OgorICAgICAgICAgIHBhY2thZ2VzOgorICAgICAgICAgICAgLSBjbGFuZy00LjAKKyAgICAgICAgICAgIC0gbGlic3RkYysrLTUtZGV2CisgICAgICAgICAgc291cmNlczoKKyAgICAgICAgICAgIC0gdWJ1bnR1LXRvb2xjaGFpbi1yLXRlc3QKKyAgICAgICAgICAgIC0gbGx2bS10b29sY2hhaW4tdHJ1c3R5LTQuMAorCisgICAgLSBvczogbGludXgKKyAgICAgIGNvbXBpbGVyOiBjbGFuZysrLTUuMAorICAgICAgZW52OiBUT09MU0VUPWNsYW5nIENPTVBJTEVSPWNsYW5nKystNS4wIENYWFNURD0wMywxMSwxNCwxegorICAgICAgYWRkb25zOgorICAgICAgICBhcHQ6CisgICAgICAgICAgcGFja2FnZXM6CisgICAgICAgICAgICAtIGNsYW5nLTUuMAorICAgICAgICAgICAgLSBsaWJzdGRjKystNS1kZXYKKyAgICAgICAgICBzb3VyY2VzOgorICAgICAgICAgICAgLSB1YnVudHUtdG9vbGNoYWluLXItdGVzdAorICAgICAgICAgICAgLSBsbHZtLXRvb2xjaGFpbi10cnVzdHktNS4wCisKKyAgICAtIG9zOiBvc3gKKyAgICAgIGNvbXBpbGVyOiBjbGFuZysrCisgICAgICBlbnY6IFRPT0xTRVQ9Y2xhbmcgQ09NUElMRVI9Y2xhbmcrKyBDWFhTVEQ9MDMsMTEsMTQsMXoKKworaW5zdGFsbDoKKyAgLSBCT09TVF9CUkFOQ0g9ZGV2ZWxvcCAmJiBbICIkVFJBVklTX0JSQU5DSCIgPT0gIm1hc3RlciIgXSAmJiBCT09TVF9CUkFOQ0g9bWFzdGVyIHx8IHRydWUKKyAgLSBjZCAuLgorICAtIGdpdCBjbG9uZSAtYiAkQk9PU1RfQlJBTkNIIC0tZGVwdGggMSBodHRwczovL2dpdGh1Yi5jb20vYm9vc3RvcmcvYm9vc3QuZ2l0IGJvb3N0LXJvb3QKKyAgLSBjZCBib29zdC1yb290CisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IHRvb2xzL2J1aWxkCisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IGxpYnMvYXNzZXJ0CisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IGxpYnMvY29uZmlnCisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IGxpYnMvY29yZQorICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCBsaWJzL3ByZXByb2Nlc3NvcgorICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCBsaWJzL3N0YXRpY19hc3NlcnQKKyAgLSBnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgbGlicy90aHJvd19leGNlcHRpb24KKyAgLSBnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgbGlicy90eXBlX3RyYWl0cworICAtIGNwIC1yICRUUkFWSVNfQlVJTERfRElSLyogbGlicy91dGlsaXR5CisgIC0gLi9ib290c3RyYXAuc2gKKyAgLSAuL2IyIGhlYWRlcnMKKworc2NyaXB0OgorICAtIHwtCisgICAgZWNobyAidXNpbmcgJFRPT0xTRVQgOiA6ICRDT01QSUxFUiA7IiA+IH4vdXNlci1jb25maWcuamFtCisgIC0gLi9iMiAtajMgbGlicy91dGlsaXR5L3Rlc3QgdG9vbHNldD0kVE9PTFNFVCBjeHhzdGQ9JENYWFNURAorCitub3RpZmljYXRpb25zOgorICBlbWFpbDoKKyAgICBvbl9zdWNjZXNzOiBhbHdheXMKZGlmZiAtLWdpdCBhL0Fzc2lnbmFibGUuaHRtbCBiL0Fzc2lnbmFibGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2IzMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvQXNzaWduYWJsZS5odG1sCkBAIC0wLDAgKzEsMTA5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CisKKyAgPHRpdGxlPkFzc2lnbmFibGU8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiBsaW5rPSIjMDAwMEVFIiB0ZXh0PSIjMDAwMDAwIiB2bGluaz0iIzU1MUE4QiIgYWxpbms9CisiI0ZGMDAwMCI+CisgIDxpbWcgc3JjPSIuLi8uLi9ib29zdC5wbmciIGFsdD0iQysrIEJvb3N0IiB3aWR0aD0iMjc3IiBoZWlnaHQ9CisgICI4NiI+PGJyIGNsZWFyPSJub25lIj4KKworICA8aDE+QXNzaWduYWJsZTwvaDE+CisKKyAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworICA8cD5BIHR5cGUgaXMgQXNzaWduYWJsZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gb25lIG9iamVjdCBvZiB0aGUgdHlwZQorICB0byBhbm90aGVyIG9iamVjdCBvZiB0aGF0IHR5cGUuPC9wPgorCisgIDxoMz5Ob3RhdGlvbjwvaDM+CisKKyAgPHRhYmxlIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5pcyB0eXBlIHRoYXQgaXMgYSBtb2RlbCBvZiBBc3NpZ25hYmxlPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+dDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5pcyBhbiBvYmplY3Qgb2YgdHlwZSA8dHQ+VDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+dTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5pcyBhbiBvYmplY3Qgb2YgdHlwZSA8dHQ+VDwvdHQ+IG9yIHBvc3NpYmx5IDx0dD5jb25zdAorICAgICAgVDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxoMz5EZWZpbml0aW9uczwvaDM+CisKKyAgPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KKworICA8dGFibGUgYm9yZGVyIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRoPk5hbWU8L3RoPgorCisgICAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CisKKyAgICAgIDx0aD5SZXR1cm4gdHlwZTwvdGg+CisKKyAgICAgIDx0aD5TZW1hbnRpY3M8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFzc2lnbm1lbnQ8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD50ID0gdTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VCZhbXA7PC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD50PC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+dTwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxoMz5Nb2RlbHM8L2gzPgorCisgIDx1bD4KKyAgICA8bGk+PHR0PmludDwvdHQ+PC9saT4KKworICAgIDxsaT48dHQ+c3RkOjpwYWlyPC90dD48L2xpPgorICA8L3VsPgorCisgIDxoMz5TZWUgYWxzbzwvaDM+CisKKyAgPHA+PGEgaHJlZj0KKyAgImh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9EZWZhdWx0Q29uc3RydWN0aWJsZS5odG1sIj5EZWZhdWx0Q29uc3RydWN0aWJsZTwvYT4KKyAgYW5kIDxhIGhyZWY9Ii4vQ29weUNvbnN0cnVjdGlibGUuaHRtbCI+Q29weUNvbnN0cnVjdGlibGU8L2E+PGJyPjwvcD4KKyAgPGhyPgorCisgIDxwPjxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrP3VyaT1yZWZlcmVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQorICAiLi4vLi4vZG9jL2ltYWdlcy92YWxpZC1odG1sNDAxLnBuZyIgYWx0PSJWYWxpZCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIgorICBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiPjwvYT48L3A+CisKKyAgPHA+UmV2aXNlZCAKKyAgPCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgcy10eXBlPSJFRElURUQiIHMtZm9ybWF0PSIlZCAlQiwgJVkiIHN0YXJ0c3BhbiAtLT4wNSBEZWNlbWJlciwgMjAwNjwhLS13ZWJib3QgYm90PSJUaW1lc3RhbXAiIGVuZHNwYW4gaS1jaGVja3N1bT0iMzg1MTYiIC0tPjwvcD4KKworICA8dGFibGUgc3VtbWFyeT0iIj4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgPHRkIG5vd3JhcD48aT5Db3B5cmlnaHQgJmNvcHk7IDIwMDA8L2k+PC90ZD4KKworICAgICAgPHRkPjxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubHNjLm5kLmVkdS9+anNpZWsiPkplcmVteSBTaWVrPC9hPiwgVW5pdi5vZgorICAgICAgTm90cmUgRGFtZSAoPGEgaHJlZj0KKyAgICAgICJtYWlsdG86anNpZWtAbHNjLm5kLmVkdSI+anNpZWtAbHNjLm5kLmVkdTwvYT4pPC9pPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8cD48aT5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKyAgYWNjb21wYW55aW5nIGZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L2E+IG9yCisgIGNvcHkgYXQgPGEgaHJlZj0KKyAgImh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L2k+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvQ29sbGVjdGlvbi5odG1sIGIvQ29sbGVjdGlvbi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MmRkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9Db2xsZWN0aW9uLmh0bWwKQEAgLTAsMCArMSw1MzQgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj4KKworICA8dGl0bGU+Q29sbGVjdGlvbjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiIGxpbms9IiMwMDAwRUUiIHRleHQ9IiMwMDAwMDAiIHZsaW5rPSIjNTUxQThCIiBhbGluaz0KKyIjRkYwMDAwIj4KKyAgPGgxPjxpbWcgc3JjPSIuLi8uLi9ib29zdC5wbmciIGFsdD0iYm9vc3QgbG9nbyIgd2lkdGg9IjI3NyIgYWxpZ249Im1pZGRsZSIKKyAgaGVpZ2h0PSI4NiI+PGJyPgorICBDb2xsZWN0aW9uPC9oMT4KKworICA8aDM+RGVzY3JpcHRpb248L2gzPgorCisgIDxwPkEgQ29sbGVjdGlvbiBpcyBhIDxpPmNvbmNlcHQ8L2k+IHNpbWlsYXIgdG8gdGhlIFNUTCA8YSBocmVmPQorICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0NvbnRhaW5lci5odG1sIj5Db250YWluZXI8L2E+IGNvbmNlcHQuIEEKKyAgQ29sbGVjdGlvbiBwcm92aWRlcyBpdGVyYXRvcnMgZm9yIGFjY2Vzc2luZyBhIHJhbmdlIG9mIGVsZW1lbnRzIGFuZAorICBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBDb2xsZWN0aW9uLgorICBIb3dldmVyLCBhIENvbGxlY3Rpb24gaGFzIGZld2VyIHJlcXVpcmVtZW50cyB0aGFuIGEgQ29udGFpbmVyLiBUaGUKKyAgbW90aXZhdGlvbiBmb3IgdGhlIENvbGxlY3Rpb24gY29uY2VwdCBpcyB0aGF0IHRoZXJlIGFyZSBtYW55IHVzZWZ1bAorICBDb250YWluZXItbGlrZSB0eXBlcyB0aGF0IGRvIG5vdCBtZWV0IHRoZSBmdWxsIHJlcXVpcmVtZW50cyBvZiBDb250YWluZXIsCisgIGFuZCBtYW55IGFsZ29yaXRobXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB3aXRoIHRoaXMgcmVkdWNlZCBzZXQgb2YKKyAgcmVxdWlyZW1lbnRzLiBUbyBzdW1tYXJpemUgdGhlIHJlZHVjdGlvbiBpbiByZXF1aXJlbWVudHM6PC9wPgorCisgIDx1bD4KKyAgICA8bGk+SXQgaXMgbm90IHJlcXVpcmVkIHRvICJvd24iIGl0cyBlbGVtZW50czogdGhlIGxpZmV0aW1lIG9mIGFuIGVsZW1lbnQKKyAgICBpbiBhIENvbGxlY3Rpb24gZG9lcyBub3QgaGF2ZSB0byBtYXRjaCB0aGUgbGlmZXRpbWUgb2YgdGhlIENvbGxlY3Rpb24KKyAgICBvYmplY3QsIHRob3VnaCB0aGUgbGlmZXRpbWUgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGNvdmVyIHRoZSBsaWZldGltZSBvZgorICAgIHRoZSBDb2xsZWN0aW9uIG9iamVjdC48L2xpPgorCisgICAgPGxpPlRoZSBzZW1hbnRpY3Mgb2YgY29weWluZyBhIENvbGxlY3Rpb24gb2JqZWN0IGlzIG5vdCBkZWZpbmVkIChpdCBjb3VsZAorICAgIGJlIGEgZGVlcCBvciBzaGFsbG93IGNvcHkgb3Igbm90IGV2ZW4gc3VwcG9ydCBjb3B5aW5nKS48L2xpPgorCisgICAgPGxpPlRoZSBhc3NvY2lhdGVkIHJlZmVyZW5jZSB0eXBlIG9mIGEgQ29sbGVjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIGEKKyAgICByZWFsIEMrKyByZWZlcmVuY2UuPC9saT4KKyAgPC91bD5CZWNhdXNlIG9mIHRoZSByZWR1Y2VkIHJlcXVpcmVtZW50cywgc29tZSBjYXJlIG11c3QgYmUgdGFrZW4gd2hlbgorICB3cml0aW5nIGNvZGUgdGhhdCBpcyBtZWFudCB0byBiZSBnZW5lcmljIGZvciBhbGwgQ29sbGVjdGlvbiB0eXBlcy4gSW4KKyAgcGFydGljdWxhciwgYSBDb2xsZWN0aW9uIG9iamVjdCBzaG91bGQgYmUgcGFzc2VkIGJ5LXJlZmVyZW5jZSBzaW5jZQorICBhc3N1bXB0aW9ucyBjYW4gbm90IGJlIG1hZGUgYWJvdXQgdGhlIGJlaGF2aW91ciBvZiB0aGUgY29weSBjb25zdHJ1Y3Rvci4KKworICA8aDM+QXNzb2NpYXRlZCB0eXBlczwvaDM+CisKKyAgPHRhYmxlIGJvcmRlciBzdW1tYXJ5PSIiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VmFsdWUgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OnZhbHVlX3R5cGU8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHR5cGUgb2YgdGhlIG9iamVjdCBzdG9yZWQgaW4gYSBDb2xsZWN0aW9uLiBJZiB0aGUKKyAgICAgIENvbGxlY3Rpb24gaXMgPGk+bXV0YWJsZTwvaT4gdGhlbiB0aGUgdmFsdWUgdHlwZSBtdXN0IGJlIDxhIGhyZWY9CisgICAgICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0Fzc2lnbmFibGUuaHRtbCI+QXNzaWduYWJsZTwvYT4uIE90aGVyd2lzZQorICAgICAgdGhlIHZhbHVlIHR5cGUgbXVzdCBiZSA8YSBocmVmPQorICAgICAgIi4vQ29weUNvbnN0cnVjdGlibGUuaHRtbCI+Q29weUNvbnN0cnVjdGlibGU8L2E+LjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+SXRlcmF0b3IgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6Oml0ZXJhdG9yPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0eXBlIG9mIGl0ZXJhdG9yIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGEKKyAgICAgIENvbGxlY3Rpb24ncyBlbGVtZW50cy4gVGhlIGl0ZXJhdG9yJ3MgdmFsdWUgdHlwZSBpcyBleHBlY3RlZCB0byBiZSB0aGUKKyAgICAgIENvbGxlY3Rpb24ncyB2YWx1ZSB0eXBlLiBBIGNvbnZlcnNpb24gZnJvbSB0aGUgaXRlcmF0b3IgdHlwZSB0byB0aGUKKyAgICAgIGNvbnN0IGl0ZXJhdG9yIHR5cGUgbXVzdCBleGlzdC4gVGhlIGl0ZXJhdG9yIHR5cGUgbXVzdCBiZSBhbiA8YSBocmVmPQorICAgICAgImh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9JbnB1dEl0ZXJhdG9yLmh0bWwiPklucHV0SXRlcmF0b3I8L2E+LjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29uc3QgaXRlcmF0b3IgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OmNvbnN0X2l0ZXJhdG9yPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgdHlwZSBvZiBpdGVyYXRvciB0aGF0IG1heSBiZSB1c2VkIHRvIGV4YW1pbmUsIGJ1dAorICAgICAgbm90IHRvIG1vZGlmeSwgYSBDb2xsZWN0aW9uJ3MgZWxlbWVudHMuPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5SZWZlcmVuY2UgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OnJlZmVyZW5jZTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHR5cGUgdGhhdCBiZWhhdmVzIGxpa2UgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgICBDb2xsZWN0aW9uJ3MgdmFsdWUgdHlwZS4gPGEgaHJlZj0iI24xIj5bMV08L2E+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db25zdCByZWZlcmVuY2UgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OmNvbnN0X3JlZmVyZW5jZTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHR5cGUgdGhhdCBiZWhhdmVzIGxpa2UgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlCisgICAgICBDb2xsZWN0aW9uJ3MgdmFsdWUgdHlwZS48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlBvaW50ZXIgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OnBvaW50ZXI8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSB0eXBlIHRoYXQgYmVoYXZlcyBhcyBhIHBvaW50ZXIgdG8gdGhlIENvbGxlY3Rpb24ncworICAgICAgdmFsdWUgdHlwZS48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkRpc3RhbmNlIHR5cGU8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5YOjpkaWZmZXJlbmNlX3R5cGU8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzaWduZWQgaW50ZWdyYWwgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGlzdGFuY2UKKyAgICAgIGJldHdlZW4gdHdvIG9mIHRoZSBDb2xsZWN0aW9uJ3MgaXRlcmF0b3JzLiBUaGlzIHR5cGUgbXVzdCBiZSB0aGUgc2FtZQorICAgICAgYXMgdGhlIGl0ZXJhdG9yJ3MgZGlzdGFuY2UgdHlwZS48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNpemUgdHlwZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg6OnNpemVfdHlwZTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5BbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgY2FuIHJlcHJlc2VudCBhbnkKKyAgICAgIG5vbm5lZ2F0aXZlIHZhbHVlIG9mIHRoZSBDb2xsZWN0aW9uJ3MgZGlzdGFuY2UgdHlwZS48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPk5vdGF0aW9uPC9oMz4KKworICA8dGFibGUgc3VtbWFyeT0iIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5YPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgdHlwZSB0aGF0IGlzIGEgbW9kZWwgb2YgQ29sbGVjdGlvbi48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5hPC90dD4sIDx0dD5iPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPk9iamVjdCBvZiB0eXBlIDx0dD5YPC90dD4uPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgdHlwZSBvZiA8dHQ+WDwvdHQ+LjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDM+VmFsaWQgZXhwcmVzc2lvbnM8L2gzPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMgbXVzdCBiZSB2YWxpZC48L3A+CisKKyAgPHRhYmxlIGJvcmRlciBzdW1tYXJ5PSIiPgorICAgIDx0cj4KKyAgICAgIDx0aD5OYW1lPC90aD4KKworICAgICAgPHRoPkV4cHJlc3Npb248L3RoPgorCisgICAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkJlZ2lubmluZyBvZiByYW5nZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuYmVnaW4oKTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+aXRlcmF0b3I8L3R0PiBpZiA8dHQ+YTwvdHQ+IGlzIG11dGFibGUsCisgICAgICA8dHQ+Y29uc3RfaXRlcmF0b3I8L3R0PiBvdGhlcndpc2U8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVuZCBvZiByYW5nZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuZW5kKCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Pml0ZXJhdG9yPC90dD4gaWYgPHR0PmE8L3R0PiBpcyBtdXRhYmxlLAorICAgICAgPHR0PmNvbnN0X2l0ZXJhdG9yPC90dD4gb3RoZXJ3aXNlPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5TaXplPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zaXplKCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PnNpemVfdHlwZTwvdHQ+PC90ZD4KKyAgICA8L3RyPjwhLS0KKzxUUj4KKzxURCBWQWxpZ249dG9wPgorTWF4aW11bSBzaXplCis8L1REPgorPFREIFZBbGlnbj10b3A+Cis8dHQ+YS5tYXhfc2l6ZSgpPC90dD4KKzwvVEQ+Cis8VEQgVkFsaWduPXRvcD4KKzx0dD5zaXplX3R5cGU8L3R0PgorPC9URD4KKzwvVFI+CistLT4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RW1wdHkgQ29sbGVjdGlvbjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuZW1wdHkoKTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db252ZXJ0aWJsZSB0byA8dHQ+Ym9vbDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5Td2FwPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zd2FwKGIpPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD52b2lkPC90dD48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPkV4cHJlc3Npb24gc2VtYW50aWNzPC9oMz4KKworICA8dGFibGUgYm9yZGVyIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRoPk5hbWU8L3RoPgorCisgICAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CisKKyAgICAgIDx0aD5TZW1hbnRpY3M8L3RoPgorCisgICAgICA8dGg+UG9zdGNvbmRpdGlvbjwvdGg+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QmVnaW5uaW5nIG9mIHJhbmdlPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5iZWdpbigpPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4KKyAgICAgIHRoZSBDb2xsZWN0aW9uLjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuYmVnaW4oKTwvdHQ+IGlzIGVpdGhlciBkZXJlZmVyZW5jZWFibGUgb3IKKyAgICAgIHBhc3QtdGhlLWVuZC4gSXQgaXMgcGFzdC10aGUtZW5kIGlmIGFuZCBvbmx5IGlmIDx0dD5hLnNpemUoKSA9PQorICAgICAgMDwvdHQ+LjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RW5kIG9mIHJhbmdlPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5lbmQoKTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5SZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIG9uZSBwYXN0IHRoZSBsYXN0IGVsZW1lbnQKKyAgICAgIGluIHRoZSBDb2xsZWN0aW9uLjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuZW5kKCk8L3R0PiBpcyBwYXN0LXRoZS1lbmQuPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5TaXplPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zaXplKCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+UmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgQ29sbGVjdGlvbiwgdGhhdCBpcywgaXRzCisgICAgICBudW1iZXIgb2YgZWxlbWVudHMuPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zaXplKCkgJmd0Oz0gMDwvdHQ+PC90ZD4KKyAgICA8L3RyPjwhLS0KKzxUUj4KKzxURCBWQWxpZ249dG9wPgorTWF4aW11bSBzaXplCis8L1REPgorPFREIFZBbGlnbj10b3A+Cis8dHQ+YS5tYXhfc2l6ZSgpPC90dD4KKzwvVEQ+Cis8VEQgVkFsaWduPXRvcD4KKyZuYnNwOworPC9URD4KKzxURCBWQWxpZ249dG9wPgorUmV0dXJucyB0aGUgbGFyZ2VzdCBzaXplIHRoYXQgdGhpcyBDb2xsZWN0aW9uIGNhbiBldmVyIGhhdmUuIDxBIGhyZWY9IiM4Ij5bOF08L0E+Cis8L1REPgorPFREIFZBbGlnbj10b3A+Cis8dHQ+YS5tYXhfc2l6ZSgpICZndDs9IDAgJmFtcDsmYW1wOyBhLm1heF9zaXplKCkgJmd0Oz0gYS5zaXplKCk8L3R0PgorPC9URD4KKzwvVFI+CisgLS0+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVtcHR5IENvbGxlY3Rpb248L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5hLmVtcHR5KCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RXF1aXZhbGVudCB0byA8dHQ+YS5zaXplKCkgPT0gMDwvdHQ+LiAoQnV0IHBvc3NpYmx5CisgICAgICBmYXN0ZXIuKTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+Jm5ic3A7PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5Td2FwPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zd2FwKGIpPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVxdWl2YWxlbnQgdG8gPHR0PnN3YXAoYSxiKTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPkNvbXBsZXhpdHkgZ3VhcmFudGVlczwvaDM+CisKKyAgPHA+PHR0PmJlZ2luKCk8L3R0PiBhbmQgPHR0PmVuZCgpPC90dD4gYXJlIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLjwvcD4KKworICA8cD48dHQ+c2l6ZSgpPC90dD4gaXMgYXQgbW9zdCBsaW5lYXIgaW4gdGhlIENvbGxlY3Rpb24ncyBzaXplLgorICA8dHQ+ZW1wdHkoKTwvdHQ+IGlzIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLjwvcD4KKworICA8cD48dHQ+c3dhcCgpPC90dD4gaXMgYXQgbW9zdCBsaW5lYXIgaW4gdGhlIHNpemUgb2YgdGhlIHR3bworICBjb2xsZWN0aW9ucy48L3A+CisKKyAgPGgzPkludmFyaWFudHM8L2gzPgorCisgIDx0YWJsZSBib3JkZXIgc3VtbWFyeT0iIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlZhbGlkIHJhbmdlPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgYW55IENvbGxlY3Rpb24gPHR0PmE8L3R0PiwgPHR0PlthLmJlZ2luKCksCisgICAgICBhLmVuZCgpKTwvdHQ+IGlzIGEgdmFsaWQgcmFuZ2UuPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5SYW5nZSBzaXplPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+YS5zaXplKCk8L3R0PiBpcyBlcXVhbCB0byB0aGUgZGlzdGFuY2UgZnJvbQorICAgICAgPHR0PmEuYmVnaW4oKTwvdHQ+IHRvIDx0dD5hLmVuZCgpPC90dD4uPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZW5lc3M8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFuIGFsZ29yaXRobSB0aGF0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIHJhbmdlCisgICAgICA8dHQ+W2EuYmVnaW4oKSwgYS5lbmQoKSk8L3R0PiB3aWxsIHBhc3MgdGhyb3VnaCBldmVyeSBlbGVtZW50IG9mCisgICAgICA8dHQ+YTwvdHQ+LjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDM+TW9kZWxzPC9oMz4KKworICA8dWw+CisgICAgPGxpPjx0dD5hcnJheTwvdHQ+PC9saT4KKworICAgIDxsaT48dHQ+YXJyYXlfcHRyPC90dD48L2xpPgorCisgICAgPGxpPjx0dD52ZWN0b3ImbHQ7Ym9vbCZndDs8L3R0PjwvbGk+CisgIDwvdWw+CisKKyAgPGgzPkNvbGxlY3Rpb24gUmVmaW5lbWVudHM8L2gzPgorCisgIDxwPlRoZXJlIGFyZSBxdWl0ZSBhIGZldyBjb25jZXB0cyB0aGF0IHJlZmluZSB0aGUgQ29sbGVjdGlvbiBjb25jZXB0LAorICBzaW1pbGFyIHRvIHRoZSBjb25jZXB0cyB0aGF0IHJlZmluZSB0aGUgQ29udGFpbmVyIGNvbmNlcHQuIEhlcmUgaXMgYSBicmllZgorICBvdmVydmlldyBvZiB0aGUgcmVmaW5pbmcgY29uY2VwdHMuPC9wPgorCisgIDxoND5Gb3J3YXJkQ29sbGVjdGlvbjwvaDQ+CisKKyAgPHA+VGhlIGVsZW1lbnRzIGFyZSBhcnJhbmdlZCBpbiBzb21lIG9yZGVyIHRoYXQgZG9lcyBub3QgY2hhbmdlCisgIHNwb250YW5lb3VzbHkgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiBBcyBhIHJlc3VsdCwgYQorICBGb3J3YXJkQ29sbGVjdGlvbiBpcyA8YSBocmVmPQorICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0VxdWFsaXR5Q29tcGFyYWJsZS5odG1sIj5FcXVhbGl0eUNvbXBhcmFibGU8L2E+CisgIGFuZCA8YSBocmVmPQorICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0xlc3NUaGFuQ29tcGFyYWJsZS5odG1sIj5MZXNzVGhhbkNvbXBhcmFibGU8L2E+LgorICBJbiBhZGRpdGlvbiwgdGhlIGl0ZXJhdG9yIHR5cGUgb2YgYSBGb3J3YXJkQ29sbGVjdGlvbiBpcyBhCisgIE11bHRpUGFzc0lucHV0SXRlcmF0b3Igd2hpY2ggaXMganVzdCBhbiBJbnB1dEl0ZXJhdG9yIHdpdGggdGhlIGFkZGVkCisgIHJlcXVpcmVtZW50cyB0aGF0IHRoZSBpdGVyYXRvciBjYW4gYmUgdXNlZCB0byBtYWtlIG11bHRpcGxlIHBhc3NlcyB0aHJvdWdoCisgIGEgcmFuZ2UsIGFuZCB0aGF0IGlmIDx0dD5pdDEgPT0gaXQyPC90dD4gYW5kIDx0dD5pdDE8L3R0PiBpcworICBkZXJlZmVyZW5jZWFibGUgdGhlbiA8dHQ+KytpdDEgPT0gKytpdDI8L3R0Pi4gVGhlIEZvcndhcmRDb2xsZWN0aW9uIGFsc28KKyAgaGFzIGEgPHR0PmZyb250KCk8L3R0PiBtZXRob2QuPC9wPgorCisgIDx0YWJsZSBib3JkZXIgc3VtbWFyeT0iIj4KKyAgICA8dHI+CisgICAgICA8dGg+TmFtZTwvdGg+CisKKyAgICAgIDx0aD5FeHByZXNzaW9uPC90aD4KKworICAgICAgPHRoPlJldHVybiB0eXBlPC90aD4KKworICAgICAgPHRoPlNlbWFudGljczwvdGg+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RnJvbnQ8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5hLmZyb250KCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PnJlZmVyZW5jZTwvdHQ+IGlmIDx0dD5hPC90dD4gaXMgbXV0YWJsZSw8YnI+CisgICAgICA8dHQ+Y29uc3RfcmVmZXJlbmNlPC90dD4gb3RoZXJ3aXNlLjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RXF1aXZhbGVudCB0byA8dHQ+KihhLmJlZ2luKCkpPC90dD4uPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxoND5SZXZlcnNpYmxlQ29sbGVjdGlvbjwvaDQ+CisKKyAgPHA+VGhlIGNvbnRhaW5lciBwcm92aWRlcyBhY2Nlc3MgdG8gaXRlcmF0b3JzIHRoYXQgdHJhdmVyc2UgaW4gYm90aAorICBkaXJlY3Rpb25zIChmb3J3YXJkIGFuZCByZXZlcnNlKS4gVGhlIGl0ZXJhdG9yIHR5cGUgbXVzdCBtZWV0IGFsbCBvZiB0aGUKKyAgcmVxdWlyZW1lbnRzIG9mIDxhIGhyZWY9CisgICJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLmh0bWwiPkJpZGlyZWN0aW9uYWxJdGVyYXRvcjwvYT4KKyAgZXhjZXB0IHRoYXQgdGhlIHJlZmVyZW5jZSB0eXBlIGRvZXMgbm90IGhhdmUgdG8gYmUgYSByZWFsIEMrKyByZWZlcmVuY2UuCisgIFRoZSBSZXZlcnNpYmxlQ29sbGVjdGlvbiBhZGRzIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIHRvIHRob3NlIG9mCisgIEZvcndhcmRDb2xsZWN0aW9uLjwvcD4KKworICA8dGFibGUgYm9yZGVyIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRoPk5hbWU8L3RoPgorCisgICAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CisKKyAgICAgIDx0aD5SZXR1cm4gdHlwZTwvdGg+CisKKyAgICAgIDx0aD5TZW1hbnRpY3M8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkJlZ2lubmluZyBvZiByYW5nZTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEucmJlZ2luKCk8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PnJldmVyc2VfaXRlcmF0b3I8L3R0PiBpZiA8dHQ+YTwvdHQ+IGlzIG11dGFibGUsCisgICAgICA8dHQ+Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjwvdHQ+IG90aGVyd2lzZS48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVxdWl2YWxlbnQgdG8KKyAgICAgIDx0dD5YOjpyZXZlcnNlX2l0ZXJhdG9yKGEuZW5kKCkpPC90dD4uPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5FbmQgb2YgcmFuZ2U8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5hLnJlbmQoKTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+cmV2ZXJzZV9pdGVyYXRvcjwvdHQ+IGlmIDx0dD5hPC90dD4gaXMgbXV0YWJsZSwKKyAgICAgIDx0dD5jb25zdF9yZXZlcnNlX2l0ZXJhdG9yPC90dD4gb3RoZXJ3aXNlLjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RXF1aXZhbGVudCB0bworICAgICAgPHR0Plg6OnJldmVyc2VfaXRlcmF0b3IoYS5iZWdpbigpKTwvdHQ+LjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QmFjazwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PmEuYmFjaygpPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5yZWZlcmVuY2U8L3R0PiBpZiA8dHQ+YTwvdHQ+IGlzIG11dGFibGUsPGJyPgorICAgICAgPHR0PmNvbnN0X3JlZmVyZW5jZTwvdHQ+IG90aGVyd2lzZS48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVxdWl2YWxlbnQgdG8gPHR0PiooLS1hLmVuZCgpKTwvdHQ+LjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDQ+U2VxdWVudGlhbENvbGxlY3Rpb248L2g0PgorCisgIDxwPlRoZSBlbGVtZW50cyBhcmUgYXJyYW5nZWQgaW4gYSBzdHJpY3QgbGluZWFyIG9yZGVyLiBObyBleHRyYSBtZXRob2RzIGFyZQorICByZXF1aXJlZC48L3A+CisKKyAgPGg0PlJhbmRvbUFjY2Vzc0NvbGxlY3Rpb248L2g0PgorCisgIDxwPlRoZSBpdGVyYXRvcnMgb2YgYSBSYW5kb21BY2Nlc3NDb2xsZWN0aW9uIHNhdGlzZnkgYWxsIG9mIHRoZQorICByZXF1aXJlbWVudHMgb2YgPGEgaHJlZj0KKyAgImh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9SYW5kb21BY2Nlc3NJdGVyYXRvci5odG1sIj5SYW5kb21BY2Nlc3NJdGVyYXRvcjwvYT4KKyAgZXhjZXB0IHRoYXQgdGhlIHJlZmVyZW5jZSB0eXBlIGRvZXMgbm90IGhhdmUgdG8gYmUgYSByZWFsIEMrKyByZWZlcmVuY2UuIEluCisgIGFkZGl0aW9uLCBhIFJhbmRvbUFjY2Vzc0NvbGxlY3Rpb24gcHJvdmlkZXMgYW4gZWxlbWVudCBhY2Nlc3Mgb3BlcmF0b3IuPC9wPgorCisgIDx0YWJsZSBib3JkZXIgc3VtbWFyeT0iIj4KKyAgICA8dHI+CisgICAgICA8dGg+TmFtZTwvdGg+CisKKyAgICAgIDx0aD5FeHByZXNzaW9uPC90aD4KKworICAgICAgPHRoPlJldHVybiB0eXBlPC90aD4KKworICAgICAgPHRoPlNlbWFudGljczwvdGg+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RWxlbWVudCBBY2Nlc3M8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5hW25dPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5yZWZlcmVuY2U8L3R0PiBpZiA8dHQ+YTwvdHQ+IGlzIG11dGFibGUsCisgICAgICA8dHQ+Y29uc3RfcmVmZXJlbmNlPC90dD4gb3RoZXJ3aXNlLjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+UmV0dXJucyB0aGUgbnRoIGVsZW1lbnQgb2YgdGhlIENvbGxlY3Rpb24uIDx0dD5uPC90dD4KKyAgICAgIG11c3QgYmUgY29udmVydGlibGUgdG8gPHR0PnNpemVfdHlwZTwvdHQ+LiBQcmVjb25kaXRpb246IDx0dD4wICZsdDs9IG4KKyAgICAgICZsdDsgYS5zaXplKCk8L3R0Pi48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPk5vdGVzPC9oMz4KKworICA8cD48YSBuYW1lPSJuMSIgaWQ9Im4xIj5bMV08L2E+IFRoZSByZWZlcmVuY2UgdHlwZSBkb2VzIG5vdCBoYXZlIHRvIGJlIGEKKyAgcmVhbCBDKysgcmVmZXJlbmNlLiBUaGUgcmVxdWlyZW1lbnRzIG9mIHRoZSByZWZlcmVuY2UgdHlwZSBkZXBlbmQgb24gdGhlCisgIGNvbnRleHQgd2l0aGluIHdoaWNoIHRoZSBDb2xsZWN0aW9uIGlzIGJlaW5nIHVzZWQuIFNwZWNpZmljYWxseSBpdCBkZXBlbmRzCisgIG9uIHRoZSByZXF1aXJlbWVudHMgdGhlIGNvbnRleHQgcGxhY2VzIG9uIHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBDb2xsZWN0aW9uLgorICBUaGUgcmVmZXJlbmNlIHR5cGUgb2YgdGhlIENvbGxlY3Rpb24gbXVzdCBtZWV0IHRoZSBzYW1lIHJlcXVpcmVtZW50cyBhcyB0aGUKKyAgdmFsdWUgdHlwZS4gSW4gYWRkaXRpb24sIHRoZSByZWZlcmVuY2Ugb2JqZWN0cyBtdXN0IGJlIGVxdWl2YWxlbnQgdG8gdGhlCisgIHZhbHVlIHR5cGUgb2JqZWN0cyBpbiB0aGUgY29sbGVjdGlvbiAod2hpY2ggaXMgdHJpdmlhbGx5IHRydWUgaWYgdGhleSBhcmUKKyAgdGhlIHNhbWUgb2JqZWN0KS4gQWxzbywgaW4gYSBtdXRhYmxlIENvbGxlY3Rpb24sIGFuIGFzc2lnbm1lbnQgdG8gdGhlCisgIHJlZmVyZW5jZSBvYmplY3QgbXVzdCByZXN1bHQgaW4gYW4gYXNzaWdubWVudCB0byB0aGUgb2JqZWN0IGluIHRoZQorICBDb2xsZWN0aW9uIChhZ2Fpbiwgd2hpY2ggaXMgdHJpdmlhbGx5IHRydWUgaWYgdGhleSBhcmUgdGhlIHNhbWUgb2JqZWN0LCBidXQKKyAgbm9uLXRyaXZpYWwgaWYgdGhlIHJlZmVyZW5jZSB0eXBlIGlzIGEgcHJveHkgY2xhc3MpLjwvcD4KKworICA8aDM+U2VlIGFsc288L2gzPgorCisgIDxwPjxhIGhyZWY9CisgICJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvQ29udGFpbmVyLmh0bWwiPkNvbnRhaW5lcjwvYT48YnI+PC9wPgorICA8aHI+CisKKyAgPHA+PGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9CisgICIuLi8uLi9kb2MvaW1hZ2VzL3ZhbGlkLWh0bWw0MDEucG5nIiBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiCisgIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+PC9hPjwvcD4KKworICA8cD5SZXZpc2VkIAorICA8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBzLXR5cGU9IkVESVRFRCIgcy1mb3JtYXQ9IiVkICVCLCAlWSIgc3RhcnRzcGFuIC0tPjA1CisgIERlY2VtYmVyLCAyMDA2PCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgZW5kc3BhbiBpLWNoZWNrc3VtPSIzODUxNiIgLS0+PC9wPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICA8dGQgbm93cmFwPjxpPkNvcHlyaWdodCAmY29weTsgMjAwMDwvaT48L3RkPgorCisgICAgICA8dGQ+PGk+PGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2plcmVteV9zaWVrLmh0bSI+SmVyZW15CisgICAgICBTaWVrPC9hPiwgVW5pdi5vZiBOb3RyZSBEYW1lIGFuZCBDKysgTGlicmFyeSAmYW1wOyBDb21waWxlciBHcm91cC9TR0kKKyAgICAgICg8YSBocmVmPSJtYWlsdG86anNpZWtAZW5nci5zZ2kuY29tIj5qc2lla0BlbmdyLnNnaS5jb208L2E+KTwvaT48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPHA+PGk+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisgIGFjY29tcGFueWluZyBmaWxlIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+TElDRU5TRV8xXzAudHh0PC9hPiBvcgorICBjb3B5IGF0IDxhIGhyZWY9CisgICJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9pPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0NvcHlDb25zdHJ1Y3RpYmxlLmh0bWwgYi9Db3B5Q29uc3RydWN0aWJsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2NlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9Db3B5Q29uc3RydWN0aWJsZS5odG1sCkBAIC0wLDAgKzEsMTg1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CisKKyAgPHRpdGxlPkNvcHkgQ29uc3RydWN0aWJsZTwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiIGxpbms9IiMwMDAwRUUiIHRleHQ9IiMwMDAwMDAiIHZsaW5rPSIjNTUxQThCIiBhbGluaz0KKyIjRkYwMDAwIj4KKyAgPGltZyBzcmM9Ii4uLy4uL2Jvb3N0LnBuZyIgYWx0PSJDKysgQm9vc3QiIHdpZHRoPSIyNzciIGhlaWdodD0KKyAgIjg2Ij48YnIgY2xlYXI9Im5vbmUiPgorCisgIDxoMT5Db3B5IENvbnN0cnVjdGlibGU8L2gxPgorCisgIDxoMz5EZXNjcmlwdGlvbjwvaDM+CisKKyAgPHA+QSB0eXBlIGlzIENvcHkgQ29uc3RydWN0aWJsZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBjb3B5IG9iamVjdHMgb2YgdGhhdAorICB0eXBlLjwvcD4KKworICA8aDM+Tm90YXRpb248L2gzPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PlQ8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+aXMgdHlwZSB0aGF0IGlzIGEgbW9kZWwgb2YgQ29weSBDb25zdHJ1Y3RpYmxlPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+dDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5pcyBhbiBvYmplY3Qgb2YgdHlwZSA8dHQ+VDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+dTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj5pcyBhbiBvYmplY3Qgb2YgdHlwZSA8dHQ+Y29uc3QgVDwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxoMz5EZWZpbml0aW9uczwvaDM+CisKKyAgPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KKworICA8dGFibGUgYm9yZGVyIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRoPk5hbWU8L3RoPgorCisgICAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CisKKyAgICAgIDx0aD5SZXR1cm4gdHlwZTwvdGg+CisKKyAgICAgIDx0aD5TZW1hbnRpY3M8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvcHkgY29uc3RydWN0b3I8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5UKHQpPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD5UPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD50PC90dD4gaXMgZXF1aXZhbGVudCB0byA8dHQ+VCh0KTwvdHQ+PC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db3B5IGNvbnN0cnVjdG9yPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHByZT4KK1QodSkKKzwvcHJlPgorICAgICAgPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+dTwvdHQ+IGlzIGVxdWl2YWxlbnQgdG8gPHR0PlQodSk8L3R0PjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+RGVzdHJ1Y3RvcjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIDxwcmU+Cit0Ln5UKCkKKzwvcHJlPgorICAgICAgPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VDwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkFkZHJlc3MgT3BlcmF0b3I8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICA8cHJlPgorJmFtcDt0Cis8L3ByZT4KKyAgICAgIDwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PlQqPC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlbm90ZXMgdGhlIGFkZHJlc3Mgb2YgPHR0PnQ8L3R0PjwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkcmVzcyBPcGVyYXRvcjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICAgIDxwcmU+CismYW1wO3UKKzwvcHJlPgorICAgICAgPC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+VCo8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVub3RlcyB0aGUgYWRkcmVzcyBvZiA8dHQ+dTwvdHQ+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxoMz5Nb2RlbHM8L2gzPgorCisgIDx1bD4KKyAgICA8bGk+PHR0PmludDwvdHQ+PC9saT4KKworICAgIDxsaT48dHQ+c3RkOjpwYWlyPC90dD48L2xpPgorICA8L3VsPgorCisgIDxoMz5Db25jZXB0IENoZWNraW5nIENsYXNzPC9oMz4KKyAgPHByZT4KKyAgdGVtcGxhdGUgJmx0O2NsYXNzIFQmZ3Q7CisgIHN0cnVjdCBDb3B5Q29uc3RydWN0aWJsZUNvbmNlcHQKKyAgeworICAgIHZvaWQgY29uc3RyYWludHMoKSB7CisgICAgICBUIGEoYik7ICAgICAgICAgICAgLy8gcmVxdWlyZSBjb3B5IGNvbnN0cnVjdG9yCisgICAgICBUKiBwdHIgPSAmYW1wO2E7ICAgICAgIC8vIHJlcXVpcmUgYWRkcmVzcyBvZiBvcGVyYXRvcgorICAgICAgY29uc3RfY29uc3RyYWludHMoYSk7CisgICAgICBpZ25vcmVfdW51c2VkX3ZhcmlhYmxlX3dhcm5pbmcocHRyKTsKKyAgICB9CisgICAgdm9pZCBjb25zdF9jb25zdHJhaW50cyhjb25zdCBUJmFtcDsgYSkgeworICAgICAgVCBjKGEpOyAgICAgICAgICAgIC8vIHJlcXVpcmUgY29uc3QgY29weSBjb25zdHJ1Y3RvcgorICAgICAgY29uc3QgVCogcHRyID0gJmFtcDthOyAvLyByZXF1aXJlIGNvbnN0IGFkZHJlc3Mgb2Ygb3BlcmF0b3IKKyAgICAgIGlnbm9yZV91bnVzZWRfdmFyaWFibGVfd2FybmluZyhjKTsKKyAgICAgIGlnbm9yZV91bnVzZWRfdmFyaWFibGVfd2FybmluZyhwdHIpOworICAgIH0KKyAgICBUIGI7CisgIH07Cis8L3ByZT4KKworICA8aDM+U2VlIGFsc288L2gzPgorCisgIDxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9EZWZhdWx0Q29uc3RydWN0aWJsZS5odG1sIj5EZWZhdWx0CisgIENvbnN0cnVjdGlibGU8L2E+IGFuZCA8YSBocmVmPSIuL0Fzc2lnbmFibGUuaHRtbCI+QXNzaWduYWJsZTwvYT48YnI+PC9wPgorICA8aHI+CisKKyAgPHA+PGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9CisgICIuLi8uLi9kb2MvaW1hZ2VzL3ZhbGlkLWh0bWw0MDEucG5nIiBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiCisgIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+PC9hPjwvcD4KKworICA8cD5SZXZpc2VkIAorICA8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBzLXR5cGU9IkVESVRFRCIgcy1mb3JtYXQ9IiVkICVCLCAlWSIgc3RhcnRzcGFuIC0tPjA1CisgIERlY2VtYmVyLCAyMDA2PCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgZW5kc3BhbiBpLWNoZWNrc3VtPSIzODUxNiIgLS0+PC9wPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICA8dGQgbm93cmFwPjxpPkNvcHlyaWdodCAmY29weTsgMjAwMDwvaT48L3RkPgorCisgICAgICA8dGQ+PGk+PGEgaHJlZj0iaHR0cDovL3d3dy5sc2MubmQuZWR1L35qc2llayI+SmVyZW15IFNpZWs8L2E+LCBVbml2Lm9mCisgICAgICBOb3RyZSBEYW1lICg8YSBocmVmPQorICAgICAgIm1haWx0bzpqc2lla0Bsc2MubmQuZWR1Ij5qc2lla0Bsc2MubmQuZWR1PC9hPik8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxwPjxpPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorICBhY2NvbXBhbnlpbmcgZmlsZSA8YSBocmVmPSIuLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvYT4gb3IKKyAgY29weSBhdCA8YSBocmVmPQorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij5odHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvaT48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9MZXNzVGhhbkNvbXBhcmFibGUuaHRtbCBiL0xlc3NUaGFuQ29tcGFyYWJsZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjkzOGYKLS0tIC9kZXYvbnVsbAorKysgYi9MZXNzVGhhbkNvbXBhcmFibGUuaHRtbApAQCAtMCwwICsxLDIxMCBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorPCEtLQorICA9PSBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OQorICA9PSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KKyAgPT0KKyAgPT0gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgID09IGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgID09IHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZAorICA9PSB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICA9PSBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBTaWxpY29uIEdyYXBoaWNzIG1ha2VzIG5vCisgID09IHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgID09IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICA9PQorICA9PSBDb3B5cmlnaHQgKGMpIDE5OTQKKyAgPT0gSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKKyAgPT0KKyAgPT0gUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlCisgID09IGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsCisgID09IHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZAorICA9PSB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICA9PSBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBtYWtlcyBubworICA9PSByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICA9PSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAgPT0KKyAgLS0+CisKKzxoZWFkPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIj4KKworICA8dGl0bGU+TGVzc1RoYW5Db21wYXJhYmxlPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgbGluaz0iIzAwMDBFRSIgdGV4dD0iIzAwMDAwMCIgdmxpbms9IiM1NTFBOEIiIGFsaW5rPQorIiNGRjAwMDAiPgorICA8aW1nIHNyYz0iLi4vLi4vYm9vc3QucG5nIiBhbHQ9IkMrKyBCb29zdCIgd2lkdGg9IjI3NyIgaGVpZ2h0PQorICAiODYiPjxiciBjbGVhcj0ibm9uZSI+CisKKyAgPGgxPkxlc3NUaGFuQ29tcGFyYWJsZTwvaDE+CisKKyAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KKworICA8cD5BIHR5cGUgaXMgTGVzc1RoYW5Db21wYXJhYmxlIGlmIGl0IGlzIG9yZGVyZWQ6IGl0IG11c3QgYmUgcG9zc2libGUgdG8KKyAgY29tcGFyZSB0d28gb2JqZWN0cyBvZiB0aGF0IHR5cGUgdXNpbmcgPHR0Pm9wZXJhdG9yJmx0OzwvdHQ+LCBhbmQKKyAgPHR0Pm9wZXJhdG9yJmx0OzwvdHQ+IG11c3QgYmUgYSBzdHJpY3Qgd2VhayBvcmRlcmluZyByZWxhdGlvbi48L3A+CisKKyAgPGgzPlJlZmluZW1lbnQgb2Y8L2gzPgorCisgIDxoMz5Bc3NvY2lhdGVkIHR5cGVzPC9oMz4KKworICA8aDM+Tm90YXRpb248L2gzPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0cj4KKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0Plg8L3R0PjwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSB0eXBlIHRoYXQgaXMgYSBtb2RlbCBvZiBMZXNzVGhhbkNvbXBhcmFibGU8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD54PC90dD4sIDx0dD55PC90dD4sIDx0dD56PC90dD48L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPk9iamVjdCBvZiB0eXBlIDx0dD5YPC90dD48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPkRlZmluaXRpb25zPC9oMz4KKworICA8cD5Db25zaWRlciB0aGUgcmVsYXRpb24gPHR0PiEoeCAmbHQ7IHkpICZhbXA7JmFtcDsgISh5ICZsdDsgeCk8L3R0Pi4gSWYKKyAgdGhpcyByZWxhdGlvbiBpcyB0cmFuc2l0aXZlICh0aGF0IGlzLCBpZiA8dHQ+ISh4ICZsdDsgeSkgJmFtcDsmYW1wOyAhKHkKKyAgJmx0OyB4KSAmYW1wOyZhbXA7ICEoeSAmbHQ7IHopICZhbXA7JmFtcDsgISh6ICZsdDsgeSk8L3R0PiBpbXBsaWVzIDx0dD4hKHgKKyAgJmx0OyB6KSAmYW1wOyZhbXA7ICEoeiAmbHQ7IHgpPC90dD4pLCB0aGVuIGl0IHNhdGlzZmllcyB0aGUgbWF0aGVtYXRpY2FsCisgIGRlZmluaXRpb24gb2YgYW4gZXF1aXZhbGVuY2UgcmVsYXRpb24uIEluIHRoaXMgY2FzZSwgPHR0Pm9wZXJhdG9yJmx0OzwvdHQ+CisgIGlzIGEgPGk+c3RyaWN0IHdlYWsgb3JkZXJpbmc8L2k+LjwvcD4KKworICA8cD5JZiA8dHQ+b3BlcmF0b3ImbHQ7PC90dD4gaXMgYSBzdHJpY3Qgd2VhayBvcmRlcmluZywgYW5kIGlmIGVhY2gKKyAgZXF1aXZhbGVuY2UgY2xhc3MgaGFzIG9ubHkgYSBzaW5nbGUgZWxlbWVudCwgdGhlbiA8dHQ+b3BlcmF0b3ImbHQ7PC90dD4gaXMKKyAgYSA8aT50b3RhbCBvcmRlcmluZzwvaT4uPC9wPgorCisgIDxoMz5WYWxpZCBleHByZXNzaW9uczwvaDM+CisKKyAgPHRhYmxlIGJvcmRlciBzdW1tYXJ5PSIiPgorICAgIDx0cj4KKyAgICAgIDx0aD5OYW1lPC90aD4KKworICAgICAgPHRoPkV4cHJlc3Npb248L3RoPgorCisgICAgICA8dGg+VHlwZSByZXF1aXJlbWVudHM8L3RoPgorCisgICAgICA8dGg+UmV0dXJuIHR5cGU8L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkxlc3M8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD54ICZsdDsgeTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnZlcnRpYmxlIHRvIDx0dD5ib29sPC90dD48L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPkV4cHJlc3Npb24gc2VtYW50aWNzPC9oMz4KKworICA8dGFibGUgYm9yZGVyIHN1bW1hcnk9IiI+CisgICAgPHRyPgorICAgICAgPHRoPk5hbWU8L3RoPgorCisgICAgICA8dGg+RXhwcmVzc2lvbjwvdGg+CisKKyAgICAgIDx0aD5QcmVjb25kaXRpb248L3RoPgorCisgICAgICA8dGg+U2VtYW50aWNzPC90aD4KKworICAgICAgPHRoPlBvc3Rjb25kaXRpb248L3RoPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPkxlc3M8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD54ICZsdDsgeTwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj48dHQ+eDwvdHQ+IGFuZCA8dHQ+eTwvdHQ+IGFyZSBpbiB0aGUgZG9tYWluIG9mCisgICAgICA8dHQ+Jmx0OzwvdHQ+PC90ZD4KKworICAgICAgPHRkIHZhbGlnbj0idG9wIj4mbmJzcDs8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisKKyAgPGgzPkNvbXBsZXhpdHkgZ3VhcmFudGVlczwvaDM+CisKKyAgPGgzPkludmFyaWFudHM8L2gzPgorCisgIDx0YWJsZSBib3JkZXIgc3VtbWFyeT0iIj4KKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPklycmVmbGV4aXZpdHk8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD54ICZsdDsgeDwvdHQ+IG11c3QgYmUgZmFsc2UuPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkIHZhbGlnbj0idG9wIj5BbnRpc3ltbWV0cnk8L3RkPgorCisgICAgICA8dGQgdmFsaWduPSJ0b3AiPjx0dD54ICZsdDsgeTwvdHQ+IGltcGxpZXMgISh5ICZsdDsgeCkgPGEgaHJlZj0KKyAgICAgICIjbjIiPlsyXTwvYT48L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRyYW5zaXRpdml0eTwvdGQ+CisKKyAgICAgIDx0ZCB2YWxpZ249InRvcCI+PHR0PnggJmx0OyB5PC90dD4gYW5kIDx0dD55ICZsdDsgejwvdHQ+IGltcGxpZXMgPHR0PngKKyAgICAgICZsdDsgejwvdHQ+IDxhIGhyZWY9IiNuMyI+WzNdPC9hPjwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDM+TW9kZWxzPC9oMz4KKworICA8dWw+CisgICAgPGxpPmludDwvbGk+CisgIDwvdWw+CisKKyAgPGgzPk5vdGVzPC9oMz4KKworICA8cD48YSBuYW1lPSJuMSIgaWQ9Im4xIj5bMV08L2E+IE9ubHkgPHR0Pm9wZXJhdG9yJmx0OzwvdHQ+IGlzIGZ1bmRhbWVudGFsOworICB0aGUgb3RoZXIgaW5lcXVhbGl0eSBvcGVyYXRvcnMgYXJlIGVzc2VudGlhbGx5IHN5bnRhY3RpYyBzdWdhci48L3A+CisKKyAgPHA+PGEgbmFtZT0ibjIiIGlkPSJuMiI+WzJdPC9hPiBBbnRpc3ltbWV0cnkgaXMgYSB0aGVvcmVtLCBub3QgYW4gYXhpb206IGl0CisgIGZvbGxvd3MgZnJvbSBpcnJlZmxleGl2aXR5IGFuZCB0cmFuc2l0aXZpdHkuPC9wPgorCisgIDxwPjxhIG5hbWU9Im4zIiBpZD0ibjMiPlszXTwvYT4gQmVjYXVzZSBvZiBpcnJlZmxleGl2aXR5IGFuZCB0cmFuc2l0aXZpdHksCisgIDx0dD5vcGVyYXRvciZsdDs8L3R0PiBhbHdheXMgc2F0aXNmaWVzIHRoZSBkZWZpbml0aW9uIG9mIGEgPGk+cGFydGlhbAorICBvcmRlcmluZzwvaT4uIFRoZSBkZWZpbml0aW9uIG9mIGEgPGk+c3RyaWN0IHdlYWsgb3JkZXJpbmc8L2k+IGlzIHN0cmljdGVyLAorICBhbmQgdGhlIGRlZmluaXRpb24gb2YgYSA8aT50b3RhbCBvcmRlcmluZzwvaT4gaXMgc3RyaWN0ZXIgc3RpbGwuPC9wPgorCisgIDxoMz5TZWUgYWxzbzwvaDM+CisKKyAgPHA+PGEgaHJlZj0KKyAgImh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9FcXVhbGl0eUNvbXBhcmFibGUuaHRtbCI+RXF1YWxpdHlDb21wYXJhYmxlPC9hPiwKKyAgPGEgaHJlZj0KKyAgImh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9TdHJpY3RXZWFrT3JkZXJpbmcuaHRtbCI+U3RyaWN0V2Vha09yZGVyaW5nPC9hPjxicj4KKyAgPC9wPgorICA8aHI+CisKKyAgPHA+PGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9CisgICIuLi8uLi9kb2MvaW1hZ2VzL3ZhbGlkLWh0bWw0MDEucG5nIiBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiCisgIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+PC9hPjwvcD4KKworICA8cD5SZXZpc2VkIAorICA8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBzLXR5cGU9IkVESVRFRCIgcy1mb3JtYXQ9IiVkICVCLCAlWSIgc3RhcnRzcGFuIC0tPjA1CisgIERlY2VtYmVyLCAyMDA2PCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgZW5kc3BhbiBpLWNoZWNrc3VtPSIzODUxNiIgLS0+PC9wPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICA8dGQgbm93cmFwPjxpPkNvcHlyaWdodCAmY29weTsgMjAwMDwvaT48L3RkPgorCisgICAgICA8dGQ+PGk+PGEgaHJlZj0iaHR0cDovL3d3dy5sc2MubmQuZWR1L35qc2llayI+SmVyZW15IFNpZWs8L2E+LCBVbml2Lm9mCisgICAgICBOb3RyZSBEYW1lICg8YSBocmVmPQorICAgICAgIm1haWx0bzpqc2lla0Bsc2MubmQuZWR1Ij5qc2lla0Bsc2MubmQuZWR1PC9hPik8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxwPjxpPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorICBhY2NvbXBhbnlpbmcgZmlsZSA8YSBocmVmPSIuLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvYT4gb3IKKyAgY29weSBhdCA8YSBocmVmPQorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij5odHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvaT48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9NdWx0aVBhc3NJbnB1dEl0ZXJhdG9yLmh0bWwgYi9NdWx0aVBhc3NJbnB1dEl0ZXJhdG9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMzMWNhMwotLS0gL2Rldi9udWxsCisrKyBiL011bHRpUGFzc0lucHV0SXRlcmF0b3IuaHRtbApAQCAtMCwwICsxLDk1IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKworPGh0bWw+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CisKKyAgPHRpdGxlPk11bHRpUGFzc0lucHV0SXRlcmF0b3I8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiBsaW5rPSIjMDAwMEVFIiB0ZXh0PSIjMDAwMDAwIiB2bGluaz0iIzU1MUE4QiIgYWxpbms9CisiI0ZGMDAwMCI+CisgIDxpbWcgc3JjPSIuLi8uLi9ib29zdC5wbmciIGFsdD0iQysrIEJvb3N0IiB3aWR0aD0iMjc3IiBoZWlnaHQ9CisgICI4NiI+PGJyIGNsZWFyPSJub25lIj4KKworICA8aDI+PGEgbmFtZT0iY29uY2VwdDpNdWx0aVBhc3NJbnB1dEl0ZXJhdG9yIiBpZD0KKyAgImNvbmNlcHQ6TXVsdGlQYXNzSW5wdXRJdGVyYXRvciI+PC9hPiBNdWx0aS1QYXNzIElucHV0IEl0ZXJhdG9yPC9oMj4KKworICA8cD5UaGlzIGNvbmNlcHQgaXMgYSByZWZpbmVtZW50IG9mIDxhIGhyZWY9CisgICJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvSW5wdXRJdGVyYXRvci5odG1sIj5JbnB1dCBJdGVyYXRvcjwvYT4sIGFkZGluZworICB0aGUgcmVxdWlyZW1lbnRzIHRoYXQgdGhlIGl0ZXJhdG9yIGNhbiBiZSB1c2VkIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzCisgIHRocm91Z2ggYSByYW5nZSwgYW5kIHRoYXQgaWYgPHR0Pml0MSA9PSBpdDI8L3R0PiBhbmQgPHR0Pml0MTwvdHQ+IGlzCisgIGRlcmVmZXJlbmNlYWJsZSB0aGVuIDx0dD4rK2l0MSA9PSArK2l0MjwvdHQ+LiBUaGUgTXVsdGktUGFzcyBJbnB1dCBJdGVyYXRvcgorICBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIDxhIGhyZWY9CisgICJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvRm9yd2FyZEl0ZXJhdG9yLmh0bWwiPkZvcndhcmQgSXRlcmF0b3I8L2E+LgorICBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgYSA8YSBocmVmPQorICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0ZvcndhcmRJdGVyYXRvci5odG1sIj5Gb3J3YXJkIEl0ZXJhdG9yPC9hPgorICByZXF1aXJlcyB0aGUgPHR0PnJlZmVyZW5jZTwvdHQ+IHR5cGUgdG8gYmUgPHR0PnZhbHVlX3R5cGUmYW1wOzwvdHQ+LAorICB3aGVyZWFzIE11bHRpUGFzc0lucHV0SXRlcmF0b3IgaXMgbGlrZSA8YSBocmVmPQorICAiaHR0cDovL3d3dy5zZ2kuY29tL3RlY2gvc3RsL0lucHV0SXRlcmF0b3IuaHRtbCI+SW5wdXQgSXRlcmF0b3I8L2E+IGluIHRoYXQKKyAgdGhlIDx0dD5yZWZlcmVuY2U8L3R0PiB0eXBlIG1lcmVseSBoYXMgdG8gYmUgY29udmVydGlibGUgdG8KKyAgPHR0PnZhbHVlX3R5cGU8L3R0Pi48L3A+CisKKyAgPGgzPkRlc2lnbiBOb3RlczwvaDM+CisKKyAgPHA+Y29tbWVudHMgYnkgVmFsZW50aW4gQm9ubmFyZDo8L3A+CisKKyAgPHA+SSB0aGluayB0aGF0IGludHJvZHVjaW5nIE11bHRpLVBhc3MgSW5wdXQgSXRlcmF0b3IgaXNuJ3QgdGhlIHJpZ2h0CisgIHNvbHV0aW9uLiBEbyB5b3UgYWxzbyB3YW50IHRvIGRlZmluZSBNdWx0aS1QYXNzIEJpZGlyZWN0aW9ubmFsIEl0ZXJhdG9yIGFuZAorICBNdWx0aS1QYXNzIFJhbmRvbSBBY2Nlc3MgSXRlcmF0b3IgPyBJIGRvbid0LCBkZWZpbml0bHkuIEl0IG9ubHkgY29uZnVzZXMKKyAgdGhlIGlzc3VlLiBUaGUgcHJvYmxlbSBsaWVzIGludG8gdGhlIGV4aXN0aW5nIGhpZXJhcmNoeSBvZiBpdGVyYXRvcnMsIHdoaWNoCisgIG1peGVzIG1vdmFiaWxsaXR5LCBtb2RpZmlhYmlsbGl0eSBhbmQgbHZhbHVlLW5lc3MsIGFuZCB0aGVzZSBhcmUgY2xlYXJseQorICBpbmRlcGVuZGFudC48L3A+CisKKyAgPHA+VGhlIHRlcm1zIEZvcndhcmQsIEJpZGlyZWN0aW9ubmFsIGFuZCBSYW5kb20gQWNjZXNzIGFyZSBhYm91dAorICBtb3ZhYmlsbGl0eSBhbmQgc2hvdWxkbid0IGJlIHVzZWQgdG8gbWVhbiBhbnl0aGluZyBlbHNlLiBJbiBhIGNvbXBsZXRseQorICBvcnRob2dvbmFsIHdheSwgaXRlcmF0b3JzIGNhbiBiZSBpbW11dGFibGUsIG11dGFibGUsIG9yIG5laXRoZXIuIEx2YWx1ZW5lc3MKKyAgb2YgaXRlcmF0b3JzIGlzIGFsc28gb3J0aG9nb25hbCB3aXRoIGltbXV0YWJpbGxpdHkuIFdpdGggdGhlc2UgY2xlYW4KKyAgY29uY2VwdHMsIHlvdXIgTXVsdGktUGFzcyBJbnB1dCBJdGVyYXRvciBpcyBqdXN0IGNhbGxlZCBhIEZvcndhcmQKKyAgSXRlcmF0b3IuPC9wPgorCisgIDxwPk90aGVyIHRyYW5zbGF0aW9ucyBhcmU6PGJyPgorICBzdGQ6OkZvcndhcmQgSXRlcmF0b3IgLSZndDsgRm9yd2FyZEl0ZXJhdG9yICZhbXA7IEx2YWx1ZSBJdGVyYXRvcjxicj4KKyAgc3RkOjpCaWRpcmVjdGlvbm5hbCBJdGVyYXRvciAtJmd0OyBCaWRpcmVjdGlvbm5hbCBJdGVyYXRvciAmYW1wOyBMdmFsdWUKKyAgSXRlcmF0b3I8YnI+CisgIHN0ZDo6UmFuZG9tIEFjY2VzcyBJdGVyYXRvciAtJmd0OyBSYW5kb20gQWNjZXNzIEl0ZXJhdG9yICZhbXA7IEx2YWx1ZQorICBJdGVyYXRvcjxicj48L3A+CisKKyAgPHA+Tm90ZSB0aGF0IGluIHByYWN0aWNlIHRoZSBvbmx5IG9wZXJhdGlvbiBub3QgYWxsb3dlZCBvbiBteSBGb3J3YXJkCisgIEl0ZXJhdG9yIHdoaWNoIGlzIGFsbG93ZWQgb24gc3RkOjpGb3J3YXJkIEl0ZXJhdG9yIGlzIDx0dD4mYW1wOyppdDwvdHQ+LiBJCisgIHRoaW5rIHRoYXQgPHR0PiZhbXA7KjwvdHQ+IGlzIHJhcmVseSBuZWVkZWQgaW4gZ2VuZXJpYyBjb2RlLjwvcD4KKworICA8cD5yZXBseSBieSBKZXJlbXkgU2llazo8L3A+CisKKyAgPHA+VGhlIGFib3ZlIGFuYWx5c2lzIGJ5IFZhbGVudGluIGlzIHJpZ2h0IG9uLiBPZiBjb3Vyc2UsIHRoZXJlIGlzIHRoZQorICBwcm9ibGVtIHdpdGggYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVGhlIGN1cnJlbnQgU1RMIGltcGxlbWVudGF0aW9ucyBhcmUKKyAgYmFzZWQgb24gdGhlIG9sZCBkZWZpbml0aW9uIG9mIEZvcndhcmQgSXRlcmF0b3IuIFRoZSByaWdodCBjb3Vyc2Ugb2YgYWN0aW9uCisgIGlzIHRvIGdldCBGb3J3YXJkIEl0ZXJhdG9yLCBldGMuIGNoYW5nZWQgaW4gdGhlIEMrKyBzdGFuZGFyZC4gT25jZSB0aGF0IGlzCisgIGRvbmUgd2UgY2FuIGRyb3AgTXVsdGktUGFzcyBJbnB1dCBJdGVyYXRvci48YnI+PC9wPgorICA8aHI+CisKKyAgPHA+PGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2s/dXJpPXJlZmVyZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9CisgICIuLi8uLi9kb2MvaW1hZ2VzL3ZhbGlkLWh0bWw0MDEucG5nIiBhbHQ9IlZhbGlkIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwiCisgIGhlaWdodD0iMzEiIHdpZHRoPSI4OCI+PC9hPjwvcD4KKworICA8cD5SZXZpc2VkIAorICA8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBzLXR5cGU9IkVESVRFRCIgcy1mb3JtYXQ9IiVkICVCLCAlWSIgc3RhcnRzcGFuIC0tPjA1CisgIERlY2VtYmVyLCAyMDA2PCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgZW5kc3BhbiBpLWNoZWNrc3VtPSIzODUxNiIgLS0+PC9wPgorCisgIDx0YWJsZSBzdW1tYXJ5PSIiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICA8dGQgbm93cmFwPjxpPkNvcHlyaWdodCAmY29weTsgMjAwMDwvaT48L3RkPgorCisgICAgICA8dGQ+PGk+PGEgaHJlZj0iaHR0cDovL3d3dy5sc2MubmQuZWR1L35qc2llayI+SmVyZW15IFNpZWs8L2E+LCBVbml2Lm9mCisgICAgICBOb3RyZSBEYW1lICg8YSBocmVmPQorICAgICAgIm1haWx0bzpqc2lla0Bsc2MubmQuZWR1Ij5qc2lla0Bsc2MubmQuZWR1PC9hPik8L2k+PC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxwPjxpPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorICBhY2NvbXBhbnlpbmcgZmlsZSA8YSBocmVmPSIuLi8uLi9MSUNFTlNFXzFfMC50eHQiPkxJQ0VOU0VfMV8wLnR4dDwvYT4gb3IKKyAgY29weSBhdCA8YSBocmVmPQorICAiaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij5odHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvaT48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9PcHRpb25hbFBvaW50ZWUuaHRtbCBiL09wdGlvbmFsUG9pbnRlZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzdlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9PcHRpb25hbFBvaW50ZWUuaHRtbApAQCAtMCwwICsxLDE1OSBAQAorPEhUTUw+Cis8SGVhZD4KKzxUaXRsZT5PcHRpb25hbFBvaW50ZWUgQ29uY2VwdDwvVGl0bGU+Cis8L0hFQUQ+Cis8Qk9EWSBCR0NPTE9SPSIjZmZmZmZmIiBMSU5LPSIjMDAwMGVlIiBURVhUPSIjMDAwMDAwIiBWTElOSz0iIzU1MWE4YiIgCisgICAgICAgIEFMSU5LPSIjZmYwMDAwIj4gCis8SU1HIFNSQz0iLi4vLi4vYm9vc3QucG5nIiAKKyAgICAgQUxUPSJDKysgQm9vc3QiIHdpZHRoPSIyNzciIGhlaWdodD0iODYiPiAKKzwhLS1lbmQgaGVhZGVyLS0+Cis8QlIgQ2xlYXI+Cis8SDE+Q29uY2VwdDogT3B0aW9uYWxQb2ludGVlPC9IMT4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KK0EgdHlwZSBpcyBhIG1vZGVsIG9mIDxpPk9wdGlvbmFsUG9pbnRlZTwvaT4gaWYgaXQgcG9pbnRzIHRvIChvciByZWZlcnMgdG8pIGEgdmFsdWUgCit0aGF0IG1heSBub3QgZXhpc3QuIFRoYXQgaXMsIGlmIGl0IGhhcyBhIDxiPnBvaW50ZWU8L2I+IHdoaWNoIG1pZ2h0IGJlIDxiPnZhbGlkPC9iPgorKGV4aXN0ZW50KSBvciA8Yj5pbnZhbGlkPC9iPiAoaW5leGlzdGVudCk7IGFuZCBpdCBpcyBwb3NzaWJsZSB0byB0ZXN0IHdoZXRoZXIgdGhlIAorcG9pbnRlZSBpcyB2YWxpZCBvciBub3QuCitUaGlzIG1vZGVsIGRvZXMgPHU+bm90PC91PiBpbXBseSBwb2ludGVyIHNlbWFudGljczogaS5lLiwgaXQgZG9lcyBub3QgaW1wbHkgc2hhbGxvdyBjb3B5IG5vcgorYWxpYXNpbmcuCis8aDM+Tm90YXRpb248L2gzPgorPFRhYmxlPgorICA8VFI+CisgICAgPFREIFZBbGlnbj10b3A+IDx0dD5UPC90dD4gPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD4gaXMgYSB0eXBlIHRoYXQgaXMgYSBtb2RlbCBvZiBPcHRpb25hbFBvaW50ZWU8L1REPgorICA8L1RSPgorICA8VFI+CisgICAgPFREIFZBbGlnbj10b3A+IDx0dD50PC90dD4gPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD4gaXMgYW4gb2JqZWN0IG9mIHR5cGUgPHR0PlQ8L3R0PiBvciBwb3NzaWJseSA8dHQ+Y29uc3QgVDwvdHQ+PC9URD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RGVmaW5pdGlvbnM8L2gzPgorPGgzPlZhbGlkIGV4cHJlc3Npb25zPC9oMz4KKzxUYWJsZSBib3JkZXI+CisgIDxUUj4KKyAgICA8VEg+IE5hbWUgPC9USD4KKyAgICA8VEg+IEV4cHJlc3Npb24gPC9USD4KKyAgICA8VEg+IFJldHVybiB0eXBlIDwvVEg+CisgICAgPFRIPiBTZW1hbnRpY3MgPC9USD4KKyAgPC9UUj4KKyAgPFRSPgorICAgIDxURCBWQWxpZ249dG9wPlZhbHVlIEFjY2VzczwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+Jm5ic3A7PHR0Pip0PC90dD48L1REPgorICAgIDxURCBWQWxpZ249dG9wPiZuYnNwOzx0dD5UJmFtcDs8L3R0PjwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+SWYgdGhlIHBvaW50ZWUgaXMgdmFsaWQgcmV0dXJucyBhIHJlZmVyZW5jZSB0bworICAgICAgdGhlIHBvaW50ZWUuPGJyPgorICAgICAgSWYgdGhlIHBvaW50ZWUgaXMgaW52YWxpZCB0aGUgcmVzdWx0IGlzIDxpPnVuZGVmaW5lZDwvaT4uPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD4gPC9URD4KKyAgPC9UUj4KKyAgPFRSPgorICAgIDxURCBWQWxpZ249dG9wPlZhbHVlIEFjY2VzczwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+Jm5ic3A7PHR0PnQtPjxpPnh5ejwvaT48L3R0PjwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+Jm5ic3A7PHR0PlQqPC90dD48L1REPgorICAgIDxURCBWQWxpZ249dG9wPklmIHRoZSBwb2ludGVlIGlzIHZhbGlkIHJldHVybnMgYSBidWlsdGluIHBvaW50ZXIgdG8gdGhlIHBvaW50ZWUuPGJyPgorICAgICAgSWYgdGhlIHBvaW50ZWUgaXMgaW52YWxpZCB0aGUgcmVzdWx0IGlzIDxpPnVuZGVmaW5lZDwvaT4gKEl0IG1pZ2h0IG5vdCBldmVuIHJldHVybiBOVUxMKS48YnI+CisgICAgPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD4gPC9URD4KKyAgPC9UUj4KKyAgPFRSPgorICAgIDxURCBWQWxpZ249dG9wPlZhbGlkaXR5IFRlc3Q8L1REPgorICAgIDxURCBWQWxpZ249dG9wPiZuYnNwOzx0dD5ib29sKHQpPC90dD48L1REPgorICAgIDxURCBWQWxpZ249dG9wPiZuYnNwO2Jvb2wgPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD5JZiB0aGUgcG9pbnRlZSBpcyB2YWxpZCByZXR1cm5zIHRydWUuPGJyPgorICAgICAgSWYgdGhlIHBvaW50ZWUgaXMgaW52YWxpZCByZXR1cm5zIGZhbHNlLjwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+PC9URD4KKyAgPC9UUj4KKyAgPFRSPgorICAgIDxURCBWQWxpZ249dG9wPkludmFsaWRpdHkgVGVzdDwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+Jm5ic3A7PHR0PiF0PC90dD48L1REPgorICAgIDxURCBWQWxpZ249dG9wPiZuYnNwO2Jvb2wgPC9URD4KKyAgICA8VEQgVkFsaWduPXRvcD5JZiB0aGUgcG9pbnRlZSBpcyB2YWxpZCByZXR1cm5zIGZhbHNlLjxicj4KKyAgICAgIElmIHRoZSBwb2ludGVlIGlzIGludmFsaWQgcmV0dXJucyB0cnVlLjwvVEQ+CisgICAgPFREIFZBbGlnbj10b3A+PC9URD4KKyAgPC9UUj4KKzwvdGFibGU+CisKKworPGgzPk1vZGVsczwvaDM+CisKKzxVTD4KKyAgPExJPjx0dD5wb2ludGVycywgYm90aCBidWlsdGluIGFuZCBzbWFydC48L3R0PgorICA8TEk+PHR0PmJvb3N0OjpvcHRpb25hbCZsdDsmZ3Q7PC90dD4KKzwvVUw+CisKKzxIUj4KKzxoMz5PcHRpb25hbFBvaW50ZWUgYW5kIHJlbGF0aW9uYWwgb3BlcmF0aW9uczwvaDM+Cis8cD5UaGlzIGNvbmNlcHQgZG9lcyBub3QgZGVmaW5lIGFueSBwYXJ0aWN1bGFyIHNlbWFudGljIGZvciByZWxhdGlvbmFsIG9wZXJhdGlvbnMsIHRoZXJlZm9yZSwKK2EgdHlwZSB3aGljaCBtb2RlbHMgdGhpcyBjb25jZXB0IG1pZ2h0IGhhdmUgZWl0aGVyIHNoYWxsb3cgb3IgZGVlcCByZWxhdGlvbmFsIHNlbWFudGljcy48YnI+CitGb3IgaW5zdGFuY2UsIHBvaW50ZXJzLCB3aGljaCBhcmUgbW9kZWxzIG9mIE9wdGlvbmFsUG9pbnRlZSwgaGF2ZSBzaGFsbG93IHJlbGF0aW9uYWwgb3BlcmF0b3JzOgorY29tcGFyaXNvbnMgb2YgcG9pbnRlcnMgZG8gbm90IGludm9sdmUgY29tcGFyaXNvbnMgb2YgcG9pbnRlZXMuCitUaGlzIG1ha2VzIHNlbnNlIGZvciBwb2ludGVycyBiZWNhdXNlIHRoZXkgaGF2ZSBzaGFsbG93IGNvcHkgc2VtYW50aWNzLjxicj4KK0J1dCBib29zdDo6b3B0aW9uYWwmbHQ7VCZndDssIG9uIHRoZSBvdGhlciBoYW5kLCB3aGljaCBpcyBhbHNvIGEgbW9kZWwgb2YgT3B0aW9uYWxQb2ludGVlLCBoYXMKK2RlZXAtY29weSBhbmQgZGVlcC1yZWxhdGlvbmFsIHNlbWFudGljcy48YnI+CitJZiBnZW5lcmljIGNvZGUgaXMgd3JpdHRlbiBmb3IgdGhpcyBjb25jZXB0LCBpdCBpcyBpbXBvcnRhbnQgbm90IHRvIHVzZSByZWxhdGlvbmFsCitvcGVyYXRvcnMgZGlyZWN0bHkgYmVjYXVzZSB0aGUgc2VtYW50aWNzIG1pZ2h0IGJlIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIGFjdHVhbCB0eXBlLjxicj4KK1N0aWxsLCB0aGUgY29uY2VwdCBpdHNlZiBjYW4gYmUgdXNlZCB0byBkZWZpbmUgPGk+ZGVlcDwvaT4gcmVsYXRpb25hbCB0ZXN0cyB0aGF0IGNhbgorYmUgdXNlZCBpbiBnZW5lcmljIGNvZGUgd2l0aCBhbnkgdHlwZSB3aGljaCBtb2RlbHMgT3B0aW9uYWxQb2ludGVlOjwvcD4KKzxhIG5hbWU9ImVxdWFsIj48L2E+Cis8cD48dT5FcXVpdmFsZW5jZSByZWxhdGlvbjo8L3U+PC9wPgorPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBPcHRpb25hbFBvaW50ZWUmZ3Q7CitpbmxpbmUKK2Jvb2wgZXF1YWxfcG9pbnRlZXMgKCBPcHRpb25hbFBvaW50ZWUgY29uc3QmYW1wOyB4LCBPcHRpb25hbFBvaW50ZWUgY29uc3QmYW1wOyB5ICkKK3sKKyAgcmV0dXJuICgheCkgIT0gKCF5KSA/IGZhbHNlIDogKCAheCA/IHRydWUgOiAoKngpID09ICgqeSkgKSA7Cit9Cit0ZW1wbGF0ZSZsdDtjbGFzcyBPcHRpb25hbFBvaW50ZWUmZ3Q7CitzdHJ1Y3QgZXF1YWxfcG9pbnRlZXNfdCA6IHN0ZDo6YmluYXJ5X2Z1bmN0aW9uJmx0O09wdGlvbmFsUG9pbnRlZSxPcHRpb25hbFBvaW50ZWUsYm9vbCZndDsKK3sKKyAgYm9vbCBvcGVyYXRvcigpICggT3B0aW9uYWxQb2ludGVlIGNvbnN0JiB4LCBPcHRpb25hbFBvaW50ZWUgY29uc3QmIHkgKSBjb25zdAorICAgIHsgcmV0dXJuIGVxdWFsX3BvaW50ZWVzKHgseSkgOyB9Cit9IDsKKzwvcHJlPgorPHA+VGhlIHByZWNlZGluZyBnZW5lcmljIGZ1bmN0aW9uIGFuZCBmdW5jdGlvbiBvYmplY3QgaGF2ZSB0aGUgZm9sbG93aW5nIHNlbWFudGljczo8YnI+CitJZiBib3RoIDxiPng8L2I+IGFuZCA8Yj55PC9iPiBoYXZlIHZhbGlkIHBvaW50ZWVzLCBpdCBjb21wYXJlcyB2YWx1ZXMgdmlhIDxjb2RlPigqeCA9PSAqeSk8L2NvZGU+Ljxicj4KK0lmIG9ubHkgb25lIGhhcyBhIHZhbGlkIHBvaW50ZWUsIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+Ljxicj4KK0lmIGJvdGggaGF2ZSBpbnZhbGlkIHBvaW50ZWVzLCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LjwvcD4KKzxhIG5hbWU9Imxlc3MiPjwvYT4KKzxwPjx1Pkxlc3MtdGhhbiByZWxhdGlvbjo8L3U+PC9wPgorPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBPcHRpb25hbFBvaW50ZWUmZ3Q7CitpbmxpbmUKK2Jvb2wgbGVzc19wb2ludGVlcyAoIE9wdGlvbmFsUG9pbnRlZSBjb25zdCZhbXA7IHgsIE9wdGlvbmFsUG9pbnRlZSBjb25zdCZhbXA7IHkgKQoreworICByZXR1cm4gIXkgPyBmYWxzZSA6ICggIXggPyB0cnVlIDogKCp4KSA8ICgqeSkgKSA7Cit9Cit0ZW1wbGF0ZSZsdDtjbGFzcyBPcHRpb25hbFBvaW50ZWUmZ3Q7CitzdHJ1Y3QgbGVzc19wb2ludGVlc190IDogc3RkOjpiaW5hcnlfZnVuY3Rpb24mbHQ7T3B0aW9uYWxQb2ludGVlLE9wdGlvbmFsUG9pbnRlZSxib29sJmd0OworeworICBib29sIG9wZXJhdG9yKCkgKCBPcHRpb25hbFBvaW50ZWUgY29uc3QmIHgsIE9wdGlvbmFsUG9pbnRlZSBjb25zdCYgeSApIGNvbnN0CisgICAgeyByZXR1cm4gbGVzc19wb2ludGVlcyh4LHkpIDsgfQorfSA7Cis8L3ByZT4KKzxwPlRoZSBwcmVjZWRpbmcgZ2VuZXJpYyBmdW5jdGlvbiBhbmQgZnVuY3Rpb24gb2JqZWN0IGhhdmUgdGhlIGZvbGxvd2luZyBzZW1hbnRpY3M6PGJyPgorSWYgPGI+eTwvYj4gaGFzIGFuIGludmFsaWQgcG9pbnRlZSwgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uPGJyPgorRWxzZSwgaWYgPGI+eDwvYj4gaGFzIGFuIGludmFsaWQgcG9pbnRlZSwgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi48YnI+CitFbHNlLCAoIDxiPng8L2I+IGFuZCA8Yj55PC9iPiBoYXZlIHZhbGlkIHBvaW50ZWVzKSwgY29tcGFyZXMgdmFsdWVzIHZpYSA8Y29kZT4oKnggJmx0OyAKKyp5KS48L2NvZGU+PC9wPgorPHA+PGJyPgorQWxsIHRoZXNlIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gCitvYmplY3RzIGFyZSBpcyBpbXBsZW1lbnRlZCBpbiA8YSBocmVmPSIuLi8uLi9ib29zdC91dGlsaXR5L2NvbXBhcmVfcG9pbnRlZXMuaHBwIj5jb21wYXJlX3BvaW50ZWVzLmhwcDwvYT48L3A+Cis8cD5Ob3RpY2UgdGhhdCBPcHRpb25hbFBvaW50ZWUgZG9lcyBub3QgaW1wbHkgYWxpYXNpbmcgKGFuZCBvcHRpb25hbCZsdDsmZ3Q7IGZvciBpbnN0YW5jZSBkb2VzIG5vdCBhbGlhcyk7CitzbyBkaXJlY3QgdXNhZ2Ugb2YgcmVsYXRpb25hbCBvcGVyYXRvcnMgd2l0aCB0aGUgaW1wbGllZCBhbGlhc2luZyBvZiBzaGFsbG93IHNlbWFudGljcworLWFzIHdpdGggcG9pbnRlcnMtIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGdlbmVyaWMgY29kZSB3cml0dGVuIGZvciB0aGlzIGNvbmNlcHQuPC9wPgorCis8aDM+QWNrbm93bGVkZ2VtZW50czwvaDM+Cis8cD5CYXNlZCBvbiB0aGUgb3JpZ2luYWwgY29uY2VwdCBkZXZlbG9wZWQgYnkgQXVndXN0dXMgU2F1bmRlcnMuCisKKzxicj4KKzwvcD4KKzxIUj4KKzxUQUJMRT4KKzxUUiB2YWxpZ249dG9wPgorPFREIG5vd3JhcD5Db3B5cmlnaHQgJmNvcHkgMjAwMzwvVEQ+PFREPgorPEEgSFJFRj0ibWFpbHRvOmZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tIj5GZXJuYW5kbyBDYWNjaW9sYTwvQT4KKzwvVEQ+PC9UUj48L1RBQkxFPgorCis8cD5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIFNlZQorPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT48L3A+CisKKzwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2FwcHZleW9yLnltbCBiL2FwcHZleW9yLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYyM2YwCi0tLSAvZGV2L251bGwKKysrIGIvYXBwdmV5b3IueW1sCkBAIC0wLDAgKzEsNDggQEAKKyMgQ29weXJpZ2h0IDIwMTYsIDIwMTcgUGV0ZXIgRGltb3YKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorIyAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly9ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCit2ZXJzaW9uOiAxLjAue2J1aWxkfS17YnJhbmNofQorCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK2JyYW5jaGVzOgorICBvbmx5OgorICAgIC0gbWFzdGVyCisgICAgLSBkZXZlbG9wCisgICAgLSAvZmVhdHVyZVwvLiovCisKK2Vudmlyb25tZW50OgorICBtYXRyaXg6CisgICAgLSBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxMworICAgICAgVE9PTFNFVDogbXN2Yy05LjAsbXN2Yy0xMC4wLG1zdmMtMTEuMCxtc3ZjLTEyLjAKKyAgICAtIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDE1CisgICAgICBUT09MU0VUOiBtc3ZjLTE0LjAKKyAgICAtIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgICBUT09MU0VUOiBtc3ZjLTE0LjEKKyAgICAgIENYWFNURDogMTQsMTcKKworaW5zdGFsbDoKKyAgLSBzZXQgQk9PU1RfQlJBTkNIPWRldmVsb3AKKyAgLSBpZiAiJUFQUFZFWU9SX1JFUE9fQlJBTkNIJSIgPT0gIm1hc3RlciIgc2V0IEJPT1NUX0JSQU5DSD1tYXN0ZXIKKyAgLSBjZCAuLgorICAtIGdpdCBjbG9uZSAtYiAlQk9PU1RfQlJBTkNIJSAtLWRlcHRoIDEgaHR0cHM6Ly9naXRodWIuY29tL2Jvb3N0b3JnL2Jvb3N0LmdpdCBib29zdC1yb290CisgIC0gY2QgYm9vc3Qtcm9vdAorICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCB0b29scy9idWlsZAorICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCBsaWJzL2Fzc2VydAorICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCBsaWJzL2NvbmZpZworICAtIGdpdCBzdWJtb2R1bGUgdXBkYXRlIC0taW5pdCBsaWJzL2NvcmUKKyAgLSBnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgbGlicy9wcmVwcm9jZXNzb3IKKyAgLSBnaXQgc3VibW9kdWxlIHVwZGF0ZSAtLWluaXQgbGlicy9zdGF0aWNfYXNzZXJ0CisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IGxpYnMvdGhyb3dfZXhjZXB0aW9uCisgIC0gZ2l0IHN1Ym1vZHVsZSB1cGRhdGUgLS1pbml0IGxpYnMvdHlwZV90cmFpdHMKKyAgLSB4Y29weSAvcyAvZSAvcSAlQVBQVkVZT1JfQlVJTERfRk9MREVSJSBsaWJzXHV0aWxpdHkKKyAgLSBjbWQgL2MgYm9vdHN0cmFwCisgIC0gYjIgLWQwIGhlYWRlcnMKKworYnVpbGQ6IG9mZgorCit0ZXN0X3NjcmlwdDoKKyAgLSBQQVRIPSVBRERQQVRIJSVQQVRIJQorICAtIGlmIG5vdCAiJUNYWFNURCUiID09ICIiIHNldCBDWFhTVEQ9Y3h4c3RkPSVDWFhTVEQlCisgIC0gYjIgLWozIGxpYnMvdXRpbGl0eS90ZXN0IHRvb2xzZXQ9JVRPT0xTRVQlICVDWFhTVEQlCmRpZmYgLS1naXQgYS9jYWxsX3RyYWl0cy5odG0gYi9jYWxsX3RyYWl0cy5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY5YzFkZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbGxfdHJhaXRzLmh0bQpAQCAtMCwwICsxLDc1NSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPG1ldGEgbmFtZT0iVGVtcGxhdGUiCitjb250ZW50PSJDOlxQUk9HUkFNIEZJTEVTXE1JQ1JPU09GVCBPRkZJQ0VcT0ZGSUNFXGh0bWwuZG90Ij4KKzxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSBFeHByZXNzIDIuMCI+Cis8dGl0bGU+Q2FsbCBUcmFpdHM8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDAwMEZGIgordmxpbms9IiM4MDAwODAiPgorCis8aDE+PGltZyBzcmM9Ii4uLy4uL2Jvb3N0LnBuZyIgd2lkdGg9IjI3NiIgaGVpZ2h0PSI4NiI+SGVhZGVyCismbHQ7PGEgaHJlZj0iLi4vLi4vYm9vc3QvZGV0YWlsL2NhbGxfdHJhaXRzLmhwcCI+Ym9vc3QvY2FsbF90cmFpdHMuaHBwPC9hPiZndDs8L2gxPgorCis8cD5BbGwgb2YgdGhlIGNvbnRlbnRzIG9mICZsdDtib29zdC9jYWxsX3RyYWl0cy5ocHAmZ3Q7IGFyZQorZGVmaW5lZCBpbnNpZGUgbmFtZXNwYWNlIGJvb3N0LjwvcD4KKworPHA+VGhlIHRlbXBsYXRlIGNsYXNzIGNhbGxfdHJhaXRzJmx0O1QmZ3Q7IGVuY2Fwc3VsYXRlcyB0aGUKKyZxdW90O2Jlc3QmcXVvdDsgbWV0aG9kIHRvIHBhc3MgYSBwYXJhbWV0ZXIgb2Ygc29tZSB0eXBlIFQgdG8gb3IKK2Zyb20gYSBmdW5jdGlvbiwgYW5kIGNvbnNpc3RzIG9mIGEgY29sbGVjdGlvbiBvZiB0eXBlZGVmcyBkZWZpbmVkCithcyBpbiB0aGUgdGFibGUgYmVsb3cuIFRoZSBwdXJwb3NlIG9mIGNhbGxfdHJhaXRzIGlzIHRvIGVuc3VyZQordGhhdCBwcm9ibGVtcyBsaWtlICZxdW90OzxhIGhyZWY9IiNyZWZzIj5yZWZlcmVuY2VzIHRvIHJlZmVyZW5jZXM8L2E+JnF1b3Q7CituZXZlciBvY2N1ciwgYW5kIHRoYXQgcGFyYW1ldGVycyBhcmUgcGFzc2VkIGluIHRoZSBtb3N0IGVmZmljaWVudAorbWFubmVyIHBvc3NpYmxlIChzZWUgPGEgaHJlZj0iI2V4YW1wbGVzIj5leGFtcGxlczwvYT4pLiBJbiBlYWNoCitjYXNlIGlmIHlvdXIgZXhpc3RpbmcgcHJhY3RpY2UgaXMgdG8gdXNlIHRoZSB0eXBlIGRlZmluZWQgb24gdGhlCitsZWZ0LCB0aGVuIHJlcGxhY2UgaXQgd2l0aCB0aGUgY2FsbF90cmFpdHMgZGVmaW5lZCB0eXBlIG9uIHRoZQorcmlnaHQuIDwvcD4KKworPHA+Tm90ZSB0aGF0IGZvciBjb21waWxlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBlaXRoZXIgcGFydGlhbAorc3BlY2lhbGl6YXRpb24gb3IgbWVtYmVyIHRlbXBsYXRlcywgbm8gYmVuZWZpdCB3aWxsIG9jY3VyIGZyb20KK3VzaW5nIGNhbGxfdHJhaXRzOiB0aGUgY2FsbF90cmFpdHMgZGVmaW5lZCB0eXBlcyB3aWxsIGFsd2F5cyBiZQordGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHByYWN0aWNlIGluIHRoaXMgY2FzZS4gSW4gYWRkaXRpb24gaWYKK29ubHkgbWVtYmVyIHRlbXBsYXRlcyBhbmQgbm90IHBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGlzYXRpb24gaXMKK3N1cHBvcnQgYnkgdGhlIGNvbXBpbGVyIChmb3IgZXhhbXBsZSBWaXN1YWwgQysrIDYpIHRoZW4KK2NhbGxfdHJhaXRzIGNhbiBub3QgYmUgdXNlZCB3aXRoIGFycmF5IHR5cGVzIChhbHRob3VnaCBpdCBjYW4gYmUKK3VzZWQgdG8gc29sdmUgdGhlIHJlZmVyZW5jZSB0byByZWZlcmVuY2UgcHJvYmxlbSkuPC9wPgorCis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNyIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI3OTciPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjMDA4MDgwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5FeGlzdGluZyBwcmFjdGljZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzUlIiBiZ2NvbG9yPSIjMDA4MDgwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5jYWxsX3RyYWl0cyBlcXVpdmFsZW50PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMiUiIGJnY29sb3I9IiMwMDgwODAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPkRlc2NyaXB0aW9uPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNiUiIGJnY29sb3I9IiMwMDgwODAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPk5vdGVzPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPlQ8YnI+CisgICAgICAgIChyZXR1cm4gYnkgdmFsdWUpPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNSUiPjxwIGFsaWduPSJjZW50ZXIiPjxjb2RlPmNhbGxfdHJhaXRzJmx0O1QmZ3Q7Ojp2YWx1ZV90eXBlPC9jb2RlPjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzIlIj5EZWZpbmVzIGEgdHlwZSB0aGF0CisgICAgICAgIHJlcHJlc2VudHMgdGhlICZxdW90O3ZhbHVlJnF1b3Q7IG9mIHR5cGUgVC4gVXNlIHRoaXMgZm9yCisgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBieSB2YWx1ZSwgb3IgcG9zc2libHkgZm9yIHN0b3JlZAorICAgICAgICB2YWx1ZXMgb2YgdHlwZSBULjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE2JSI+PHAgYWxpZ249ImNlbnRlciI+MjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5UJmFtcDs8YnI+CisgICAgICAgIChyZXR1cm4gdmFsdWUpPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNSUiPjxwIGFsaWduPSJjZW50ZXIiPjxjb2RlPmNhbGxfdHJhaXRzJmx0O1QmZ3Q7OjpyZWZlcmVuY2U8L2NvZGU+PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMiUiPkRlZmluZXMgYSB0eXBlIHRoYXQKKyAgICAgICAgcmVwcmVzZW50cyBhIHJlZmVyZW5jZSB0byB0eXBlIFQuIFVzZSBmb3IgZnVuY3Rpb25zIHRoYXQKKyAgICAgICAgd291bGQgbm9ybWFsbHkgcmV0dXJuIGEgVCZhbXA7LjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE2JSI+PHAgYWxpZ249ImNlbnRlciI+MTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5jb25zdAorICAgICAgICBUJmFtcDs8YnI+CisgICAgICAgIChyZXR1cm4gdmFsdWUpPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNSUiPjxwIGFsaWduPSJjZW50ZXIiPjxjb2RlPmNhbGxfdHJhaXRzJmx0O1QmZ3Q7Ojpjb25zdF9yZWZlcmVuY2U8L2NvZGU+PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMiUiPkRlZmluZXMgYSB0eXBlIHRoYXQKKyAgICAgICAgcmVwcmVzZW50cyBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0eXBlIFQuIFVzZSBmb3IKKyAgICAgICAgZnVuY3Rpb25zIHRoYXQgd291bGQgbm9ybWFsbHkgcmV0dXJuIGEgY29uc3QgVCZhbXA7LjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE2JSI+PHAgYWxpZ249ImNlbnRlciI+MTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5jb25zdAorICAgICAgICBUJmFtcDs8YnI+CisgICAgICAgIChmdW5jdGlvbiBwYXJhbWV0ZXIpPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzNSUiPjxwIGFsaWduPSJjZW50ZXIiPjxjb2RlPmNhbGxfdHJhaXRzJmx0O1QmZ3Q7OjpwYXJhbV90eXBlPC9jb2RlPjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzIlIj5EZWZpbmVzIGEgdHlwZSB0aGF0CisgICAgICAgIHJlcHJlc2VudHMgdGhlICZxdW90O2Jlc3QmcXVvdDsgd2F5IHRvIHBhc3MgYSBwYXJhbWV0ZXIKKyAgICAgICAgb2YgdHlwZSBUIHRvIGEgZnVuY3Rpb24uPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTYlIj48cCBhbGlnbj0iY2VudGVyIj4xLDM8L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxwPk5vdGVzOjwvcD4KKworPG9sPgorICAgIDxsaT5JZiBUIGlzIGFscmVhZHkgcmVmZXJlbmNlIHR5cGUsIHRoZW4gY2FsbF90cmFpdHMgaXMKKyAgICAgICAgZGVmaW5lZCBzdWNoIHRoYXQgPGEgaHJlZj0iI3JlZnMiPnJlZmVyZW5jZXMgdG8KKyAgICAgICAgcmVmZXJlbmNlczwvYT4gZG8gbm90IG9jY3VyIChyZXF1aXJlcyBwYXJ0aWFsCisgICAgICAgIHNwZWNpYWxpemF0aW9uKS48L2xpPgorICAgIDxsaT5JZiBUIGlzIGFuIGFycmF5IHR5cGUsIHRoZW4gY2FsbF90cmFpdHMgZGVmaW5lcyA8Y29kZT52YWx1ZV90eXBlPC9jb2RlPgorICAgICAgICBhcyBhICZxdW90O2NvbnN0YW50IHBvaW50ZXIgdG8gdHlwZSZxdW90OyByYXRoZXIgdGhhbiBhbgorICAgICAgICAmcXVvdDthcnJheSBvZiB0eXBlJnF1b3Q7IChyZXF1aXJlcyBwYXJ0aWFsCisgICAgICAgIHNwZWNpYWxpemF0aW9uKS4gTm90ZSB0aGF0IGlmIHlvdSBhcmUgdXNpbmcgdmFsdWVfdHlwZSBhcworICAgICAgICBhIHN0b3JlZCB2YWx1ZSB0aGVuIHRoaXMgd2lsbCByZXN1bHQgaW4gc3RvcmluZyBhICZxdW90O2NvbnN0YW50CisgICAgICAgIHBvaW50ZXIgdG8gYW4gYXJyYXkmcXVvdDsgcmF0aGVyIHRoYW4gdGhlIGFycmF5IGl0c2VsZi4KKyAgICAgICAgVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBhIGdvb2QgdGhpbmcgZGVwZW5kaW5nIHVwb24gd2hhdAorICAgICAgICB5b3UgYWN0dWFsbHkgbmVlZCAoaW4gb3RoZXIgd29yZHMgdGFrZSBjYXJlISkuPC9saT4KKyAgICA8bGk+SWYgVCBpcyBhIHNtYWxsIGJ1aWx0IGluIHR5cGUgb3IgYSBwb2ludGVyLCB0aGVuIDxjb2RlPnBhcmFtX3R5cGU8L2NvZGU+CisgICAgICAgIGlzIGRlZmluZWQgYXMgPGNvZGU+VCBjb25zdDwvY29kZT4sIGluc3RlYWQgb2YgPGNvZGU+VAorICAgICAgICBjb25zdCZhbXA7PC9jb2RlPi4gVGhpcyBjYW4gaW1wcm92ZSB0aGUgYWJpbGl0eSBvZiB0aGUKKyAgICAgICAgY29tcGlsZXIgdG8gb3B0aW1pemUgbG9vcHMgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIGlmCisgICAgICAgIHRoZXkgZGVwZW5kIHVwb24gdGhlIHBhc3NlZCBwYXJhbWV0ZXIsIHRoZSBzZW1hbnRpY3Mgb2YKKyAgICAgICAgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgaXMgb3RoZXJ3aXNlIHVuY2hhbmdlZCAocmVxdWlyZXMKKyAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbikuPC9saT4KKzwvb2w+CisKKzxwPiZuYnNwOzwvcD4KKworPGgzPkNvcHkgY29uc3RydWN0aWJpbGl0eTwvaDM+CisKKzxwPlRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5lcyB3aGljaCBjYWxsX3RyYWl0cyB0eXBlcyBjYW4gYWx3YXlzCitiZSBjb3B5LWNvbnN0cnVjdGVkIGZyb20gd2hpY2ggb3RoZXIgdHlwZXMsIHRob3NlIGVudHJpZXMgbWFya2VkCit3aXRoIGEgJz8nIGFyZSB0cnVlIG9ubHkgaWYgYW5kIG9ubHkgaWYgVCBpcyBjb3B5IGNvbnN0cnVjdGlibGU6PC9wPgorCis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNyIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI3NjYiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj4mbmJzcDs8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjUiIHdpZHRoPSI4NSUiCisgICAgICAgIGJnY29sb3I9IiMwMDgwODAiPjxwIGFsaWduPSJjZW50ZXIiPlRvOjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjMDA4MDgwIj5Gcm9tOjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+VDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj52YWx1ZV90eXBlPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPnJlZmVyZW5jZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5jb25zdF9yZWZlcmVuY2U8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+cGFyYW1fdHlwZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj5UPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4/PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPj88L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPlk8L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+dmFsdWVfdHlwZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+PzwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4/PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPk48L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+TjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPnJlZmVyZW5jZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+PzwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4/PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPlk8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPmNvbnN0X3JlZmVyZW5jZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+PzwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5OPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPk48L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPnBhcmFtX3R5cGU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPj88L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+PzwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5OPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPk48L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPHA+Jm5ic3A7PC9wPgorCis8cD5JZiBUIGlzIGFuIGFzc2lnbmFibGUgdHlwZSB0aGUgZm9sbG93aW5nIGFzc2lnbm1lbnRzIGFyZQorcG9zc2libGU6PC9wPgorCis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNyIgY2VsbHNwYWNpbmc9IjEiIHdpZHRoPSI3NjYiPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj4mbmJzcDs8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNvbHNwYW49IjUiIHdpZHRoPSI4NSUiCisgICAgICAgIGJnY29sb3I9IiMwMDgwODAiPjxwIGFsaWduPSJjZW50ZXIiPlRvOjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjMDA4MDgwIj5Gcm9tOjwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+VDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj52YWx1ZV90eXBlPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPnJlZmVyZW5jZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5jb25zdF9yZWZlcmVuY2U8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+cGFyYW1fdHlwZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj5UPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPlk8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+LTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4tPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPi08L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+dmFsdWVfdHlwZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPi08L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+LTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4tPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPnJlZmVyZW5jZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPi08L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+LTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4tPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPmNvbnN0X3JlZmVyZW5jZTwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5ZPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPi08L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+LTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4tPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPnBhcmFtX3R5cGU8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPlk8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+WTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj4tPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPi08L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+LTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPHA+Jm5ic3A7PC9wPgorCis8aDM+PGEgbmFtZT0iZXhhbXBsZXMiPjwvYT5FeGFtcGxlczwvaDM+CisKKzxwPlRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIGVmZmVjdCB0aGF0IGNhbGxfdHJhaXRzIGhhcyBvbgordmFyaW91cyB0eXBlcywgdGhlIHRhYmxlIGFzc3VtZXMgdGhhdCB0aGUgY29tcGlsZXIgc3VwcG9ydHMKK3BhcnRpYWwgc3BlY2lhbGl6YXRpb246IGlmIGl0IGRvZXNuJ3QgdGhlbiBhbGwgdHlwZXMgYmVoYXZlIGluCit0aGUgc2FtZSB3YXkgYXMgdGhlIGVudHJ5IGZvciAmcXVvdDtteWNsYXNzJnF1b3Q7LCBhbmQKK2NhbGxfdHJhaXRzIGNhbiBub3QgYmUgdXNlZCB3aXRoIHJlZmVyZW5jZSBvciBhcnJheSB0eXBlcy48L3A+CisKKzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI3IiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9Ijc2NiI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPiZuYnNwOzwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgY29sc3Bhbj0iNSIgd2lkdGg9Ijg1JSIKKyAgICAgICAgYmdjb2xvcj0iIzAwODA4MCI+PHAgYWxpZ249ImNlbnRlciI+Q2FsbF90cmFpdHMgdHlwZTo8L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iIzAwODA4MCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+T3JpZ2luYWwgdHlwZSBUPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPnZhbHVlX3R5cGU8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+cmVmZXJlbmNlPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPmNvbnN0X3JlZmVyZW5jZTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5wYXJhbV90eXBlPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPkFwcGxpZXMgdG86PC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPm15Y2xhc3M8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+bXljbGFzczwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5teWNsYXNzJmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgbXljbGFzcyZhbXA7PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPm15Y2xhc3MKKyAgICAgICAgY29uc3QmYW1wOzwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5BbGwgdXNlcgorICAgICAgICBkZWZpbmVkIHR5cGVzLjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIiBiZ2NvbG9yPSIjQzBDMEMwIj48cAorICAgICAgICBhbGlnbj0iY2VudGVyIj5pbnQ8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmludCZhbXA7PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmNvbnN0CisgICAgICAgIGludCZhbXA7PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmludCBjb25zdDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5BbGwgc21hbGwKKyAgICAgICAgYnVpbHQtaW4gdHlwZXMuPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPmludCo8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50KjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5pbnQqJmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50KmNvbnN0JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50KiBjb25zdDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5BbGwKKyAgICAgICAgcG9pbnRlciB0eXBlcy48L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+aW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+aW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+QWxsCisgICAgICAgIHJlZmVyZW5jZSB0eXBlcy48L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+Y29uc3QgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QKKyAgICAgICAgaW50JmFtcDs8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+QWxsCisgICAgICAgIGNvbnN0YW50LXJlZmVyZW5jZXMuPC9wPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiIGJnY29sb3I9IiNDMEMwQzAiPjxwCisgICAgICAgIGFsaWduPSJjZW50ZXIiPmludFszXTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5jb25zdCBpbnQqPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmludCgmYW1wOylbM108L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QgaW50KCZhbXA7KVszXTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5jb25zdCBpbnQqCisgICAgICAgIGNvbnN0PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPkFsbCBhcnJheQorICAgICAgICB0eXBlcy48L3A+CisgICAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSIgYmdjb2xvcj0iI0MwQzBDMCI+PHAKKyAgICAgICAgYWxpZ249ImNlbnRlciI+Y29uc3QgaW50WzNdPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmNvbnN0IGludCo8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+Y29uc3QgaW50KCZhbXA7KVszXTwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTclIj48cCBhbGlnbj0iY2VudGVyIj5jb25zdCBpbnQoJmFtcDspWzNdPC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNyUiPjxwIGFsaWduPSJjZW50ZXIiPmNvbnN0IGludCoKKyAgICAgICAgY29uc3Q8L3A+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjE3JSI+PHAgYWxpZ249ImNlbnRlciI+QWxsCisgICAgICAgIGNvbnN0YW50LWFycmF5IHR5cGVzLjwvcD4KKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPHA+Jm5ic3A7PC9wPgorCis8aDQ+RXhhbXBsZSAxOjwvaDQ+CisKKzxwPlRoZSBmb2xsb3dpbmcgY2xhc3MgaXMgYSB0cml2aWFsIGNsYXNzIHRoYXQgc3RvcmVzIHNvbWUgdHlwZSBUCitieSB2YWx1ZSAoc2VlIHRoZSA8YSBocmVmPSJjYWxsX3RyYWl0c190ZXN0LmNwcCI+Y2FsbF90cmFpdHNfdGVzdC5jcHA8L2E+CitmaWxlKSwgdGhlIGFpbSBpcyB0byBpbGx1c3RyYXRlIGhvdyBlYWNoIG9mIHRoZSBhdmFpbGFibGUKK2NhbGxfdHJhaXRzIHR5cGVkZWZzIG1heSBiZSB1c2VkOjwvcD4KKworPHByZT50ZW1wbGF0ZSAmbHQ7Y2xhc3MgVCZndDsKK3N0cnVjdCBjb250YWluZWQKK3sKKyAgIC8vIGRlZmluZSBvdXIgdHlwZWRlZnMgZmlyc3QsIGFycmF5cyBhcmUgc3RvcmVkIGJ5IHZhbHVlCisgICAvLyBzbyB2YWx1ZV90eXBlIGlzIG5vdCB0aGUgc2FtZSBhcyByZXN1bHRfdHlwZToKKyAgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzJmx0O1QmZ3Q7OjpwYXJhbV90eXBlICAgICAgIHBhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0cyZsdDtUJmd0Ozo6cmVmZXJlbmNlICAgICAgICByZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0cyZsdDtUJmd0Ozo6Y29uc3RfcmVmZXJlbmNlICBjb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHMmbHQ7VCZndDs6OnZhbHVlX3R5cGUgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgIC8vIHN0b3JlZCB2YWx1ZToKKyAgIHZhbHVlX3R5cGUgdl87CisgICAKKyAgIC8vIGNvbnN0cnVjdG9yczoKKyAgIGNvbnRhaW5lZCgpIHt9CisgICBjb250YWluZWQocGFyYW1fdHlwZSBwKSA6IHZfKHApe30KKyAgIC8vIHJldHVybiBieXZhbDoKKyAgIHJlc3VsdF90eXBlIHZhbHVlKCkgeyByZXR1cm4gdl87IH0KKyAgIC8vIHJldHVybiBieV9yZWY6CisgICByZWZlcmVuY2UgZ2V0KCkgeyByZXR1cm4gdl87IH0KKyAgIGNvbnN0X3JlZmVyZW5jZSBjb25zdF9nZXQoKWNvbnN0IHsgcmV0dXJuIHZfOyB9CisgICAvLyBwYXNzIHZhbHVlOgorICAgdm9pZCBjYWxsKHBhcmFtX3R5cGUgcCl7fQorCit9OzwvcHJlPgorCis8aDQ+PGEgbmFtZT0icmVmcyI+PC9hPkV4YW1wbGUgMiAodGhlIHJlZmVyZW5jZSB0byByZWZlcmVuY2UKK3Byb2JsZW0pOjwvaDQ+CisKKzxwPkNvbnNpZGVyIHRoZSBkZWZpbml0aW9uIG9mIHN0ZDo6YmluZGVyMXN0OjwvcD4KKworPHByZT50ZW1wbGF0ZSAmbHQ7Y2xhc3MgT3BlcmF0aW9uJmd0OyAKK2NsYXNzIGJpbmRlcjFzdCA6IAorICAgcHVibGljIHVuYXJ5X2Z1bmN0aW9uJmx0O3R5cGVuYW1lIE9wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsIHR5cGVuYW1lIE9wZXJhdGlvbjo6cmVzdWx0X3R5cGUmZ3Q7IAoreyAKK3Byb3RlY3RlZDogCisgICBPcGVyYXRpb24gb3A7IAorICAgdHlwZW5hbWUgT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlIHZhbHVlOyAKK3B1YmxpYzogCisgICBiaW5kZXIxc3QoY29uc3QgT3BlcmF0aW9uJmFtcDsgeCwgY29uc3QgdHlwZW5hbWUgT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJmFtcDsgeSk7IAorICAgdHlwZW5hbWUgT3BlcmF0aW9uOjpyZXN1bHRfdHlwZSBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIE9wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmYW1wOyB4KSBjb25zdDsgCit9OyA8L3ByZT4KKworPHA+Tm93IGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpbiB0aGUgcmVsYXRpdmVseSBjb21tb24gY2FzZSB0aGF0Cit0aGUgZnVuY3RvciB0YWtlcyBpdHMgc2Vjb25kIGFyZ3VtZW50IGFzIGEgcmVmZXJlbmNlLCB0aGF0CitpbXBsaWVzIHRoYXQgPGNvZGU+T3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZTwvY29kZT4gaXMgYQorcmVmZXJlbmNlIHR5cGUsIDxjb2RlPm9wZXJhdG9yKCk8L2NvZGU+IHdpbGwgbm93IGVuZCB1cCB0YWtpbmcgYQorcmVmZXJlbmNlIHRvIGEgcmVmZXJlbmNlIGFzIGFuIGFyZ3VtZW50LCBhbmQgdGhhdCBpcyBub3QKK2N1cnJlbnRseSBsZWdhbC4gVGhlIHNvbHV0aW9uIGhlcmUgaXMgdG8gbW9kaWZ5IDxjb2RlPm9wZXJhdG9yKCk8L2NvZGU+Cit0byB1c2UgY2FsbF90cmFpdHM6PC9wPgorCis8cHJlPnR5cGVuYW1lIE9wZXJhdGlvbjo6cmVzdWx0X3R5cGUgb3BlcmF0b3IoKSh0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDt0eXBlbmFtZSBPcGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlJmd0Ozo6cGFyYW1fdHlwZSB4KSBjb25zdDs8L3ByZT4KKworPHA+Tm93IGluIHRoZSBjYXNlIHRoYXQgPGNvZGU+T3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZTwvY29kZT4KK2lzIGEgcmVmZXJlbmNlIHR5cGUsIHRoZSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgYSByZWZlcmVuY2UsIGFuZAordGhlIG5vICZxdW90O3JlZmVyZW5jZSB0byByZWZlcmVuY2UmcXVvdDsgb2NjdXJzLjwvcD4KKworPGg0PjxhIG5hbWU9ImV4MyI+PC9hPkV4YW1wbGUgMyAodGhlIG1ha2VfcGFpciBwcm9ibGVtKTo8L2g0PgorCis8cD5JZiB3ZSBwYXNzIHRoZSBuYW1lIG9mIGFuIGFycmF5IGFzIG9uZSAob3IgYm90aCkgYXJndW1lbnRzIHRvIDxjb2RlPnN0ZDo6bWFrZV9wYWlyPC9jb2RlPiwKK3RoZW4gdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGRlZHVjZXMgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgYXMKKyZxdW90O2NvbnN0IHJlZmVyZW5jZSB0byBhcnJheSBvZiBUJnF1b3Q7LCB0aGlzIGFsc28gYXBwbGllcyB0bworc3RyaW5nIGxpdGVyYWxzICh3aGljaCBhcmUgcmVhbGx5IGFycmF5IGxpdGVyYWxzKS4gQ29uc2VxdWVudGx5CitpbnN0ZWFkIG9mIHJldHVybmluZyBhIHBhaXIgb2YgcG9pbnRlcnMsIGl0IHRyaWVzIHRvIHJldHVybiBhCitwYWlyIG9mIGFycmF5cywgYW5kIHNpbmNlIGFuIGFycmF5IHR5cGUgaXMgbm90IGNvcHktY29uc3RydWN0aWJsZQordGhlIGNvZGUgZmFpbHMgdG8gY29tcGlsZS4gT25lIHNvbHV0aW9uIGlzIHRvIGV4cGxpY2l0bHkgY2FzdCB0aGUKK2FyZ3VtZW50cyB0byBtYWtlX3BhaXIgdG8gcG9pbnRlcnMsIGJ1dCBjYWxsX3RyYWl0cyBwcm92aWRlcyBhCitiZXR0ZXIgKGkuZS4gYXV0b21hdGljKSBzb2x1dGlvbiAoYW5kIG9uZSB0aGF0IHdvcmtzIHNhZmVseSBldmVuCitpbiBnZW5lcmljIGNvZGUgd2hlcmUgdGhlIGNhc3QgbWlnaHQgZG8gdGhlIHdyb25nIHRoaW5nKTo8L3A+CisKKzxwcmU+dGVtcGxhdGUgJmx0O2NsYXNzIFQxLCBjbGFzcyBUMiZndDsKK3N0ZDo6cGFpciZsdDsKKyAgIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0cyZsdDtUMSZndDs6OnZhbHVlX3R5cGUsIAorICAgdHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzJmx0O1QyJmd0Ozo6dmFsdWVfdHlwZSZndDsgCisgICAgICBtYWtlX3BhaXIoY29uc3QgVDEmYW1wOyB0MSwgY29uc3QgVDImYW1wOyB0MikKK3sKKyAgIHJldHVybiBzdGQ6OnBhaXImbHQ7CisgICAgICB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHMmbHQ7VDEmZ3Q7Ojp2YWx1ZV90eXBlLCAKKyAgICAgIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0cyZsdDtUMiZndDs6OnZhbHVlX3R5cGUmZ3Q7KHQxLCB0Mik7Cit9PC9wcmU+CisKKzxwPkhlcmUsIHRoZSBkZWR1Y2VkIGFyZ3VtZW50IHR5cGVzIHdpbGwgYmUgYXV0b21hdGljYWxseQorZGVncmFkZWQgdG8gcG9pbnRlcnMgaWYgdGhlIGRlZHVjZWQgdHlwZXMgYXJlIGFycmF5cywgc2ltaWxhcgorc2l0dWF0aW9ucyBvY2N1ciBpbiB0aGUgc3RhbmRhcmQgYmluZGVycyBhbmQgYWRhcHRlcnM6IGluCitwcmluY2lwbGUgaW4gYW55IGZ1bmN0aW9uIHRoYXQgJnF1b3Q7d3JhcHMmcXVvdDsgYSB0ZW1wb3JhcnkKK3dob3NlIHR5cGUgaXMgZGVkdWNlZC4gTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgdG8KK21ha2VfcGFpciBhcmUgbm90IGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBjYWxsX3RyYWl0czogZG9pbmcgc28KK3dvdWxkIHByZXZlbnQgdGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGZyb20gZnVuY3Rpb25pbmcuPC9wPgorCis8aDQ+PGEgbmFtZT0iZXg0Ij48L2E+RXhhbXBsZSA0IChvcHRpbWlzaW5nIGZpbGwpOjwvaDQ+CisKKzxwPlRoZSBjYWxsX3RyYWl0cyB0ZW1wbGF0ZSB3aWxsICZxdW90O29wdGltaXplJnF1b3Q7IHRoZSBwYXNzaW5nCitvZiBhIHNtYWxsIGJ1aWx0LWluIHR5cGUgYXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIHRoaXMgbWFpbmx5IGhhcworYW4gZWZmZWN0IHdoZW4gdGhlIHBhcmFtZXRlciBpcyB1c2VkIHdpdGhpbiBhIGxvb3AgYm9keS4gSW4gdGhlCitmb2xsb3dpbmcgZXhhbXBsZSAoc2VlIDxhCitocmVmPSIuLi90eXBlX3RyYWl0cy9leGFtcGxlcy9maWxsX2V4YW1wbGUuY3BwIj5maWxsX2V4YW1wbGUuY3BwPC9hPiksCithIHZlcnNpb24gb2Ygc3RkOjpmaWxsIGlzIG9wdGltaXplZCBpbiB0d28gd2F5czogaWYgdGhlIHR5cGUKK3Bhc3NlZCBpcyBhIHNpbmdsZSBieXRlIGJ1aWx0LWluIHR5cGUgdGhlbiBzdGQ6Om1lbXNldCBpcyB1c2VkIHRvCitlZmZlY3QgdGhlIGZpbGwsIG90aGVyd2lzZSBhIGNvbnZlbnRpb25hbCBDKysgaW1wbGVtZW50aW9uIGlzCit1c2VkLCBidXQgd2l0aCB0aGUgcGFzc2VkIHBhcmFtZXRlciAmcXVvdDtvcHRpbWl6ZWQmcXVvdDsgdXNpbmcKK2NhbGxfdHJhaXRzOjwvcD4KKworPHByZT5uYW1lc3BhY2UgZGV0YWlseworCit0ZW1wbGF0ZSAmbHQ7Ym9vbCBvcHQmZ3Q7CitzdHJ1Y3QgZmlsbGVyCit7CisgICB0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgSSwgdHlwZW5hbWUgVCZndDsKKyAgIHN0YXRpYyB2b2lkIGRvX2ZpbGwoSSBmaXJzdCwgSSBsYXN0LCB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHMmbHQ7VCZndDs6OnBhcmFtX3R5cGUgdmFsKQorICAgeworICAgICAgd2hpbGUoZmlyc3QgIT0gbGFzdCkKKyAgICAgIHsKKyAgICAgICAgICpmaXJzdCA9IHZhbDsKKyAgICAgICAgICsrZmlyc3Q7CisgICAgICB9CisgICB9Cit9OworCit0ZW1wbGF0ZSAmbHQ7Jmd0Oworc3RydWN0IGZpbGxlciZsdDt0cnVlJmd0OworeworICAgdGVtcGxhdGUgJmx0O3R5cGVuYW1lIEksIHR5cGVuYW1lIFQmZ3Q7CisgICBzdGF0aWMgdm9pZCBkb19maWxsKEkgZmlyc3QsIEkgbGFzdCwgVCB2YWwpCisgICB7CisgICAgICBtZW1zZXQoZmlyc3QsIHZhbCwgbGFzdC1maXJzdCk7CisgICB9Cit9OworCit9CisKK3RlbXBsYXRlICZsdDtjbGFzcyBJLCBjbGFzcyBUJmd0OworaW5saW5lIHZvaWQgZmlsbChJIGZpcnN0LCBJIGxhc3QsIGNvbnN0IFQmYW1wOyB2YWwpCit7CisgICBlbnVteyBjYW5fb3B0ID0gYm9vc3Q6OmlzX3BvaW50ZXImbHQ7SSZndDs6OnZhbHVlCisgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOyBib29zdDo6aXNfYXJpdGhtZXRpYyZsdDtUJmd0Ozo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAmYW1wOyZhbXA7IChzaXplb2YoVCkgPT0gMSkgfTsKKyAgIHR5cGVkZWYgZGV0YWlsOjpmaWxsZXImbHQ7Y2FuX29wdCZndDsgZmlsbGVyX3Q7CisgICBmaWxsZXJfdDo6dGVtcGxhdGUgZG9fZmlsbCZsdDtJLFQmZ3Q7KGZpcnN0LCBsYXN0LCB2YWwpOworfTwvcHJlPgorCis8cD5Gb290bm90ZTogdGhlIHJlYXNvbiB0aGF0IHRoaXMgaXMgJnF1b3Q7b3B0aW1hbCZxdW90OyBmb3IKK3NtYWxsIGJ1aWx0LWluIHR5cGVzIGlzIHRoYXQgd2l0aCB0aGUgdmFsdWUgcGFzc2VkIGFzICZxdW90O1QKK2NvbnN0JnF1b3Q7IGluc3RlYWQgb2YgJnF1b3Q7Y29uc3QgVCZhbXA7JnF1b3Q7IHRoZSBjb21waWxlciBpcworYWJsZSB0byB0ZWxsIGJvdGggdGhhdCB0aGUgdmFsdWUgaXMgY29uc3RhbnQgYW5kIHRoYXQgaXQgaXMgZnJlZQorb2YgYWxpYXNlcy4gV2l0aCB0aGlzIGluZm9ybWF0aW9uIHRoZSBjb21waWxlciBpcyBhYmxlIHRvIGNhY2hlCit0aGUgcGFzc2VkIHZhbHVlIGluIGEgcmVnaXN0ZXIsIHVucm9sbCB0aGUgbG9vcCwgb3IgdXNlCitleHBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9uczogaWYgYW55IG9mIHRoZXNlIGFyZSBzdXBwb3J0ZWQuCitFeGFjdGx5IGhvdyBtdWNoIG1pbGVhZ2UgeW91IHdpbGwgZ2V0IGZyb20gdGhpcyBkZXBlbmRzIHVwb24geW91cgorY29tcGlsZXIgLSB3ZSBjb3VsZCByZWFsbHkgdXNlIHNvbWUgYWNjdXJhdGUgYmVuY2htYXJraW5nCitzb2Z0d2FyZSBhcyBwYXJ0IG9mIGJvb3N0IGZvciBjYXNlcyBsaWtlIHRoaXMuPC9wPgorCis8cD5Ob3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyB0byBmaWxsIGFyZSBub3QgZXhwcmVzc2VkIGluCit0ZXJtcyBvZiBjYWxsX3RyYWl0czogZG9pbmcgc28gd291bGQgcHJldmVudCB0ZW1wbGF0ZSBhcmd1bWVudAorZGVkdWN0aW9uIGZyb20gZnVuY3Rpb25pbmcuIEluc3RlYWQgZmlsbCBhY3RzIGFzIGEgJnF1b3Q7dGhpbgord3JhcHBlciZxdW90OyB0aGF0IGlzIHRoZXJlIHRvIHBlcmZvcm0gdGVtcGxhdGUgYXJndW1lbnQKK2RlZHVjdGlvbiwgdGhlIGNvbXBpbGVyIHdpbGwgb3B0aW1pc2UgYXdheSB0aGUgY2FsbCB0byBmaWxsIGFsbAordG9nZXRoZXIsIHJlcGxhY2luZyBpdCB3aXRoIHRoZSBjYWxsIHRvIGZpbGxlciZsdDsmZ3Q7Ojpkb19maWxsLAord2hpY2ggZG9lcyB1c2UgY2FsbF90cmFpdHMuPC9wPgorCis8aDM+UmF0aW9uYWxlPC9oMz4KKworPHA+VGhlIGZvbGxvd2luZyBub3RlcyBhcmUgaW50ZW5kZWQgdG8gYnJpZWZseSBkZXNjcmliZSB0aGUKK3JhdGlvbmFsIGJlaGluZCBjaG9pY2VzIG1hZGUgaW4gY2FsbF90cmFpdHMuPC9wPgorCis8cD5BbGwgdXNlci1kZWZpbmVkIHR5cGVzIGZvbGxvdyAmcXVvdDtleGlzdGluZyBwcmFjdGljZSZxdW90OworYW5kIG5lZWQgbm8gY29tbWVudC48L3A+CisKKzxwPlNtYWxsIGJ1aWx0LWluIHR5cGVzICh3aGF0IHRoZSBzdGFuZGFyZCBjYWxscyBmdW5kYW1lbnRhbAordHlwZXMgWzMuOS4xXSkgZGlmZmVyIGZyb20gZXhpc3RpbmcgcHJhY3RpY2Ugb25seSBpbiB0aGUgPGk+cGFyYW1fdHlwZTwvaT4KK3R5cGVkZWYuIEluIHRoaXMgY2FzZSBwYXNzaW5nICZxdW90O1QgY29uc3QmcXVvdDsgaXMgY29tcGF0aWJsZQord2l0aCBleGlzdGluZyBwcmFjdGljZSwgYnV0IG1heSBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgY2FzZXMKKyhzZWUgPGEgaHJlZj0iI2V4NCI+RXhhbXBsZSA0PC9hPiksIGluIGFueSBjYXNlIHRoaXMgc2hvdWxkIG5ldmVyCitiZSBhbnkgd29yc2UgdGhhbiBleGlzdGluZyBwcmFjdGljZS48L3A+CisKKzxwPlBvaW50ZXJzIGZvbGxvdyB0aGUgc2FtZSByYXRpb25hbCBhcyBzbWFsbCBidWlsdC1pbiB0eXBlcy48L3A+CisKKzxwPkZvciByZWZlcmVuY2UgdHlwZXMgdGhlIHJhdGlvbmFsIGZvbGxvd3MgPGEgaHJlZj0iI3JlZnMiPkV4YW1wbGUKKzI8L2E+IC0gcmVmZXJlbmNlcyB0byByZWZlcmVuY2VzIGFyZSBub3QgYWxsb3dlZCwgc28gdGhlCitjYWxsX3RyYWl0cyBtZW1iZXJzIG11c3QgYmUgZGVmaW5lZCBzdWNoIHRoYXQgdGhlc2UgcHJvYmxlbXMgZG8KK25vdCBvY2N1ci4gVGhlcmUgaXMgYSBwcm9wb3NhbCB0byBtb2RpZnkgdGhlIGxhbmd1YWdlIHN1Y2ggdGhhdAorJnF1b3Q7YSByZWZlcmVuY2UgdG8gYSByZWZlcmVuY2UgaXMgYSByZWZlcmVuY2UmcXVvdDsgKGlzc3VlICMxMDYsCitzdWJtaXR0ZWQgYnkgQmphcm5lIFN0cm91c3RydXApLCBjYWxsX3RyYWl0cyZsdDtUJmd0Ozo6dmFsdWVfdHlwZQorYW5kIGNhbGxfdHJhaXRzJmx0O1QmZ3Q7OjpwYXJhbV90eXBlIGJvdGggcHJvdmlkZSB0aGUgc2FtZSBlZmZlY3QKK2FzIHRoYXQgcHJvcG9zYWwsIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgbGFuZ3VhZ2UgY2hhbmdlIChpbgorb3RoZXIgd29yZHMgaXQncyBhIHdvcmthcm91bmQpLjwvcD4KKworPHA+Rm9yIGFycmF5IHR5cGVzLCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gYXJyYXkgYXMgYW4gYXJndW1lbnQKK3dpbGwgZGVncmFkZSB0aGUgYXJyYXkgdHlwZSB0byBhIHBvaW50ZXIgdHlwZTogdGhpcyBtZWFucyB0aGF0Cit0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIHBhcmFtZXRlciBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgZGVjbGFyZWQKK3R5cGUsIHNvbWV0aGluZyB0aGF0IGNhbiBjYXVzZSBlbmRsZXNzIHByb2JsZW1zIGluIHRlbXBsYXRlIGNvZGUKK3RoYXQgcmVsaWVzIG9uIHRoZSBkZWNsYXJlZCB0eXBlIG9mIGEgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTo8L3A+CisKKzxwcmU+dGVtcGxhdGUgJmx0O2NsYXNzIFQmZ3Q7CitzdHJ1Y3QgQQoreworICAgdm9pZCBmb28oVCB0KTsKK307PC9wcmU+CisKKzxwPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+SW4gdGhpcyBjYXNlIGlmIHdlIGluc3RhbnRpYXRlCitBJmx0O2ludFsyXSZndDsgdGhlbiB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIHBhc3NlZCB0bworbWVtYmVyIGZ1bmN0aW9uIGZvbyBpcyBpbnRbMl0sIGJ1dCBpdCdzIGFjdHVhbCB0eXBlIGlzIGNvbnN0IGludCosCitpZiB3ZSB0cnkgdG8gdXNlIHRoZSB0eXBlIFQgd2l0aGluIHRoZSBmdW5jdGlvbiBib2R5LCB0aGVuIHRoZXJlCitpcyBhIHN0cm9uZyBsaWtlbHlob29kIHRoYXQgb3VyIGNvZGUgd2lsbCBub3QgY29tcGlsZTo8L2ZvbnQ+PC9wPgorCis8cHJlPnRlbXBsYXRlICZsdDtjbGFzcyBUJmd0Owordm9pZCBBJmx0O1QmZ3Q7Ojpmb28oVCB0KQoreworICAgVCBkdXAodCk7IC8vIGRvZXNuJ3QgY29tcGlsZSBmb3IgY2FzZSB0aGF0IFQgaXMgYW4gYXJyYXkuCit9PC9wcmU+CisKKzxwPkJ5IHVzaW5nIGNhbGxfdHJhaXRzIHRoZSBkZWdyYWRhdGlvbiBmcm9tIGFycmF5IHRvIHBvaW50ZXIgaXMKK2V4cGxpY2l0LCBhbmQgdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpcyB0aGUgc2FtZSBhcyBpdCdzCitkZWNsYXJlZCB0eXBlOjwvcD4KKworPHByZT50ZW1wbGF0ZSAmbHQ7Y2xhc3MgVCZndDsKK3N0cnVjdCBBCit7CisgICB2b2lkIGZvbyh0eXBlbmFtZSBjYWxsX3RyYWl0cyZsdDtUJmd0Ozo6dmFsdWVfdHlwZSB0KTsKK307CisKK3RlbXBsYXRlICZsdDtjbGFzcyBUJmd0Owordm9pZCBBJmx0O1QmZ3Q7Ojpmb28odHlwZW5hbWUgY2FsbF90cmFpdHMmbHQ7VCZndDs6OnZhbHVlX3R5cGUgdCkKK3sKKyAgIHR5cGVuYW1lIGNhbGxfdHJhaXRzJmx0O1QmZ3Q7Ojp2YWx1ZV90eXBlIGR1cCh0KTsgLy8gT0sgZXZlbiBpZiBUIGlzIGFuIGFycmF5IHR5cGUuCit9PC9wcmU+CisKKzxwPkZvciB2YWx1ZV90eXBlIChyZXR1cm4gYnkgdmFsdWUpLCBhZ2FpbiBvbmx5IGEgcG9pbnRlciBtYXkgYmUKK3JldHVybmVkLCBub3QgYSBjb3B5IG9mIHRoZSB3aG9sZSBhcnJheSwgYW5kIGFnYWluIGNhbGxfdHJhaXRzCittYWtlcyB0aGUgZGVncmFkYXRpb24gZXhwbGljaXQuIFRoZSB2YWx1ZV90eXBlIG1lbWJlciBpcyB1c2VmdWwKK3doZW5ldmVyIGFuIGFycmF5IG11c3QgYmUgZXhwbGljaXRseSBkZWdyYWRlZCB0byBhIHBvaW50ZXIgLSA8YQoraHJlZj0iI2V4MyI+RXhhbXBsZSAzPC9hPiBwcm92aWRlcyB0aGUgdGVzdCBjYXNlIChGb290bm90ZTogdGhlCithcnJheSBzcGVjaWFsaXNhdGlvbiBmb3IgY2FsbF90cmFpdHMgaXMgdGhlIGxlYXN0IHdlbGwgdW5kZXJzdG9vZAorb2YgYWxsIHRoZSBjYWxsX3RyYWl0cyBzcGVjaWFsaXNhdGlvbnMsIGlmIHRoZSBnaXZlbiBzZW1hbnRpY3MKK2NhdXNlIHNwZWNpZmljIHByb2JsZW1zIGZvciB5b3UsIG9yIGRvbid0IHNvbHZlIGEgcGFydGljdWxhcgorYXJyYXktcmVsYXRlZCBwcm9ibGVtLCB0aGVuIEkgd291bGQgYmUgaW50ZXJlc3RlZCB0byBoZWFyIGFib3V0CitpdC4gTW9zdCBwZW9wbGUgdGhvdWdoIHdpbGwgcHJvYmFibHkgbmV2ZXIgbmVlZCB0byB1c2UgdGhpcworc3BlY2lhbGlzYXRpb24pLjwvcD4KKworPGhyPgorCis8cD5SZXZpc2VkIDAxIFNlcHRlbWJlciAyMDAwPC9wPgorCisgICA8cD4KKyAgICAgIENvcHlyaWdodCAyMDAwIFN0ZXZlIENsZWFyeSwgQmVtYW4gRGF3ZXMsIEhvd2FyZAorICAgICAgSGlubmFudCBhbmQgSm9obiBNYWRkb2NrLiA8YnIvPgorICAgICAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUKKyAgICAgIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQKKyAgICAgIG9yIGNvcHkgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij4KKyAgICAgICAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dAorICAgICAgPC9hPikuCisgICA8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL2NoZWNrZWRfZGVsZXRlLmh0bWwgYi9jaGVja2VkX2RlbGV0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTMyNTYKLS0tIC9kZXYvbnVsbAorKysgYi9jaGVja2VkX2RlbGV0ZS5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9cmVmcmVzaCBjb250ZW50PSIwOyBVUkw9Li4vY29yZS9kb2MvaHRtbC9jb3JlL2NoZWNrZWRfZGVsZXRlLmh0bWwiPgorPHRpdGxlPkF1dG9tYXRpYyByZWRpcmVjdGlvbjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KK0F1dG9tYXRpYyByZWRpcmVjdGlvbiBmYWlsZWQsIHBsZWFzZSBnbyB0bworPGEgaHJlZj0iLi4vY29yZS9kb2MvaHRtbC9jb3JlL2NoZWNrZWRfZGVsZXRlLmh0bWwiPmNoZWNrZWRfZGVsZXRlLmh0bWw8L2E+LiZuYnNwOzxocj4KKzxwPqkgQ29weXJpZ2h0IEJlbWFuIERhd2VzLCAyMDAxPC9wPgorPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyAKK2ZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L2E+IG9yIGNvcHkgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPnd3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9jb21wcmVzc2VkX3BhaXIuaHRtIGIvY29tcHJlc3NlZF9wYWlyLmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjk5YmY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcHJlc3NlZF9wYWlyLmh0bQpAQCAtMCwwICsxLDE2IEBACisKKzwhLS0KK0NvcHlyaWdodCAyMDE0IERhbmllbCBKYW1lcy4KK0Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKK2ZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLS0+CisKKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDsgVVJMPWRvYy9odG1sL2NvbXByZXNzZWRfcGFpci5odG1sIj4KKzwvaGVhZD4KKzxib2R5PgorQXV0b21hdGljIHJlZGlyZWN0aW9uIGZhaWxlZCwgcGxlYXNlIGdvIHRvCis8YSBocmVmPSJkb2MvaHRtbC9jb21wcmVzc2VkX3BhaXIuaHRtbCI+ZG9jL2h0bWwvY29tcHJlc3NlZF9wYWlyLmh0bWw8L2E+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9kb2MvSmFtZmlsZS52MiBiL2RvYy9KYW1maWxlLnYyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYThmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvSmFtZmlsZS52MgpAQCAtMCwwICsxLDEyNyBAQAorCisjIENvcHlyaWdodCBKb2huIE1hZGRvY2sgMjAwNS4gVXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gYXJlCisjIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworIyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworcHJvamVjdCA6IHJlcXVpcmVtZW50cworICAgICAgICAjIFBhdGggZm9yIGxpbmtzIHRvIEJvb3N0OgorICAgICAgICA8eHNsOnBhcmFtPmJvb3N0LnJvb3Q9Li4vLi4vLi4vLi4KKworICAgICAgICAjIFNvbWUgZ2VuZXJhbCBzdHlsZSBzZXR0aW5nczoKKyAgICAgICAgPHhzbDpwYXJhbT50YWJsZS5mb290bm90ZS5udW1iZXIuZm9ybWF0PTEKKyAgICAgICAgPHhzbDpwYXJhbT5mb290bm90ZS5udW1iZXIuZm9ybWF0PTEKKworICAgICAgICAjIEhUTUwgb3B0aW9ucyBmaXJzdDoKKyAgICAgICAgIyBVc2UgZ3JhcGhpY3Mgbm90IHRleHQgZm9yIG5hdmlnYXRpb246CisgICAgICAgIDx4c2w6cGFyYW0+bmF2aWcuZ3JhcGhpY3M9MQorICAgICAgICMgUERGIE9wdGlvbnM6CisgICAgICAgICMgVE9DIEdlbmVyYXRpb246IHRoaXMgaXMgbmVlZGVkIGZvciBGT1AtMC45IGFuZCBsYXRlcjoKKyAgICAgICAgPHhzbDpwYXJhbT5mb3AxLmV4dGVuc2lvbnM9MAorICAgICAgICA8eHNsOnBhcmFtPnhlcC5leHRlbnNpb25zPTEKKyAgICAgICAgIyBUT0MgZ2VuZXJhdGlvbjogdGhpcyBpcyBuZWVkZWQgZm9yIEZPUCAwLjIsIGJ1dCBtdXN0IG5vdCBiZSBzZXQgdG8gemVybyBmb3IgRk9QLTAuOSEKKyAgICAgICAgPHhzbDpwYXJhbT5mb3AuZXh0ZW5zaW9ucz0wCisgICAgICAgICMgTm8gaW5kZW50IG9uIGJvZHkgdGV4dDoKKyAgICAgICAgPHhzbDpwYXJhbT5ib2R5LnN0YXJ0LmluZGVudD0wcHQKKyAgICAgICAgIyBNYXJnaW4gc2l6ZToKKyAgICAgICAgPHhzbDpwYXJhbT5wYWdlLm1hcmdpbi5pbm5lcj0wLjVpbgorICAgICAgICAjIE1hcmdpbiBzaXplOgorICAgICAgICA8eHNsOnBhcmFtPnBhZ2UubWFyZ2luLm91dGVyPTAuNWluCisgICAgICAgICMgUGFwZXIgdHlwZSA9IEE0CisgICAgICAgIDx4c2w6cGFyYW0+cGFwZXIudHlwZT1BNAorICAgICAgICAjIFllcywgd2Ugd2FudCBncmFwaGljcyBmb3IgYWRtb25pc2htZW50czoKKyAgICAgICAgPHhzbDpwYXJhbT5hZG1vbi5ncmFwaGljcz0xCisgICAgICAgICMgU2V0IHRoaXMgb25lIGZvciBQREYgZ2VuZXJhdGlvbiAqb25seSo6CisgICAgICAgICMgZGVmYXVsdCBwbmQgZ3JhcGhpY3MgYXJlIGF3ZnVsIGluIFBERiBmb3JtLAorICAgICAgICAjIGJldHRlciB1c2UgU1ZHJ3MgaW5zdGVhZDoKKyAgICAgICAgPGZvcm1hdD5wZGY6PHhzbDpwYXJhbT5hZG1vbi5ncmFwaGljcy5leHRlbnNpb249Ii5zdmciCisgICAgICAgIDxmb3JtYXQ+cGRmOjx4c2w6cGFyYW0+YWRtb24uZ3JhcGhpY3MucGF0aD0kKGJvb3N0LWltYWdlcykvCisgICAgICAgIDxmb3JtYXQ+cGRmOjx4c2w6cGFyYW0+Ym9vc3QudXJsLnByZWZpeD1odHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy9yZWxlYXNlL2xpYnMvdXRpbGl0eS9kb2MvaHRtbAorOworCit1c2luZyBxdWlja2Jvb2sgOworCitwYXRoLWNvbnN0YW50IGJvb3N0LWltYWdlcyA6IC4uLy4uLy4uL2RvYy9zcmMvaW1hZ2VzIDsKKworeG1sIGJhc2VfZnJvbV9tZW1iZXIgOiBiYXNlX2Zyb21fbWVtYmVyLnFiayA7Citib29zdGJvb2sgc3RhbmRhbG9uZV9iYXNlX2Zyb21fbWVtYmVyCisgICAgOgorICAgICAgICBiYXNlX2Zyb21fbWVtYmVyCisgICAgOgorICAgICAgICAjIEZpbGUgbmFtZSBvZiBIVE1MIG91dHB1dDoKKyAgICAgICAgPHhzbDpwYXJhbT5yb290LmZpbGVuYW1lPWJhc2VfZnJvbV9tZW1iZXIKKyAgICAgICAgIyBIb3cgZmFyIGRvd24gd2UgY2h1bmsgbmVzdGVkIHNlY3Rpb25zLCBiYXNpY2FsbHkgYWxsIG9mIHRoZW06CisgICAgICAgIDx4c2w6cGFyYW0+Y2h1bmsuc2VjdGlvbi5kZXB0aD0wCisgICAgICAgICMgRG9uJ3QgcHV0IHRoZSBmaXJzdCBzZWN0aW9uIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIFRPQzoKKyAgICAgICAgPHhzbDpwYXJhbT5jaHVuay5maXJzdC5zZWN0aW9ucz0wCisgICAgICAgICMgSG93IGZhciBkb3duIHNlY3Rpb25zIGdldCBUT0MncworICAgICAgICA8eHNsOnBhcmFtPnRvYy5zZWN0aW9uLmRlcHRoPTEKKyAgICAgICAgIyBNYXggZGVwdGggaW4gZWFjaCBUT0M6CisgICAgICAgIDx4c2w6cGFyYW0+dG9jLm1heC5kZXB0aD0xCisgICAgICAgICMgSG93IGZhciBkb3duIHdlIGdvIHdpdGggVE9DJ3MKKyAgICAgICAgPHhzbDpwYXJhbT5nZW5lcmF0ZS5zZWN0aW9uLnRvYy5sZXZlbD0xCisgICAgIDsKKworeG1sIGNvbXByZXNzZWRfcGFpciA6IGNvbXByZXNzZWRfcGFpci5xYmsgOworYm9vc3Rib29rIHN0YW5kYWxvbmVfY29tcHJlc3NlZF9wYWlyCisgICAgOgorICAgICAgICBjb21wcmVzc2VkX3BhaXIKKyAgICA6CisgICAgICAgICMgRmlsZSBuYW1lIG9mIEhUTUwgb3V0cHV0OgorICAgICAgICA8eHNsOnBhcmFtPnJvb3QuZmlsZW5hbWU9Y29tcHJlc3NlZF9wYWlyCisgICAgICAgICMgSG93IGZhciBkb3duIHdlIGNodW5rIG5lc3RlZCBzZWN0aW9ucywgYmFzaWNhbGx5IGFsbCBvZiB0aGVtOgorICAgICAgICA8eHNsOnBhcmFtPmNodW5rLnNlY3Rpb24uZGVwdGg9MAorICAgICAgICAjIERvbid0IHB1dCB0aGUgZmlyc3Qgc2VjdGlvbiBvbiB0aGUgc2FtZSBwYWdlIGFzIHRoZSBUT0M6CisgICAgICAgIDx4c2w6cGFyYW0+Y2h1bmsuZmlyc3Quc2VjdGlvbnM9MAorICAgICAgICAjIEhvdyBmYXIgZG93biBzZWN0aW9ucyBnZXQgVE9DJ3MKKyAgICAgICAgPHhzbDpwYXJhbT50b2Muc2VjdGlvbi5kZXB0aD0xCisgICAgICAgICMgTWF4IGRlcHRoIGluIGVhY2ggVE9DOgorICAgICAgICA8eHNsOnBhcmFtPnRvYy5tYXguZGVwdGg9MQorICAgICAgICAjIEhvdyBmYXIgZG93biB3ZSBnbyB3aXRoIFRPQydzCisgICAgICAgIDx4c2w6cGFyYW0+Z2VuZXJhdGUuc2VjdGlvbi50b2MubGV2ZWw9MQorICAgICA7CisKK3htbCBkZWNsdmFsIDogZGVjbHZhbC5xYmsgOworYm9vc3Rib29rIHN0YW5kYWxvbmVfZGVjbHZhbAorICAgIDoKKyAgICAgICAgZGVjbHZhbAorICAgIDoKKyAgICAgICAgIyBGaWxlIG5hbWUgb2YgSFRNTCBvdXRwdXQ6CisgICAgICAgIDx4c2w6cGFyYW0+cm9vdC5maWxlbmFtZT1kZWNsdmFsCisgICAgICAgICMgSG93IGZhciBkb3duIHdlIGNodW5rIG5lc3RlZCBzZWN0aW9ucywgYmFzaWNhbGx5IGFsbCBvZiB0aGVtOgorICAgICAgICA8eHNsOnBhcmFtPmNodW5rLnNlY3Rpb24uZGVwdGg9MAorICAgICAgICAjIERvbid0IHB1dCB0aGUgZmlyc3Qgc2VjdGlvbiBvbiB0aGUgc2FtZSBwYWdlIGFzIHRoZSBUT0M6CisgICAgICAgIDx4c2w6cGFyYW0+Y2h1bmsuZmlyc3Quc2VjdGlvbnM9MAorICAgICAgICAjIEhvdyBmYXIgZG93biBzZWN0aW9ucyBnZXQgVE9DJ3MKKyAgICAgICAgPHhzbDpwYXJhbT50b2Muc2VjdGlvbi5kZXB0aD0xCisgICAgICAgICMgTWF4IGRlcHRoIGluIGVhY2ggVE9DOgorICAgICAgICA8eHNsOnBhcmFtPnRvYy5tYXguZGVwdGg9MQorICAgICAgICAjIEhvdyBmYXIgZG93biB3ZSBnbyB3aXRoIFRPQydzCisgICAgICAgIDx4c2w6cGFyYW0+Z2VuZXJhdGUuc2VjdGlvbi50b2MubGV2ZWw9MQorICAgICA7CisKK3htbCBzdHJpbmdfcmVmIDogc3RyaW5nX3JlZi5xYmsgOworYm9vc3Rib29rIHN0YW5kYWxvbmVfc3RyaW5nX3JlZgorICAgIDoKKyAgICAgICAgc3RyaW5nX3JlZgorICAgIDoKKyAgICAgICAgIyBGaWxlIG5hbWUgb2YgSFRNTCBvdXRwdXQ6CisgICAgICAgIDx4c2w6cGFyYW0+cm9vdC5maWxlbmFtZT1zdHJpbmdfcmVmCisgICAgICAgICMgSG93IGZhciBkb3duIHdlIGNodW5rIG5lc3RlZCBzZWN0aW9ucywgYmFzaWNhbGx5IGFsbCBvZiB0aGVtOgorICAgICAgICA8eHNsOnBhcmFtPmNodW5rLnNlY3Rpb24uZGVwdGg9MAorICAgICAgICAjIERvbid0IHB1dCB0aGUgZmlyc3Qgc2VjdGlvbiBvbiB0aGUgc2FtZSBwYWdlIGFzIHRoZSBUT0M6CisgICAgICAgIDx4c2w6cGFyYW0+Y2h1bmsuZmlyc3Quc2VjdGlvbnM9MAorICAgICAgICAjIEhvdyBmYXIgZG93biBzZWN0aW9ucyBnZXQgVE9DJ3MKKyAgICAgICAgPHhzbDpwYXJhbT50b2Muc2VjdGlvbi5kZXB0aD0xCisgICAgICAgICMgTWF4IGRlcHRoIGluIGVhY2ggVE9DOgorICAgICAgICA8eHNsOnBhcmFtPnRvYy5tYXguZGVwdGg9MQorICAgICAgICAjIEhvdyBmYXIgZG93biB3ZSBnbyB3aXRoIFRPQydzCisgICAgICAgIDx4c2w6cGFyYW0+Z2VuZXJhdGUuc2VjdGlvbi50b2MubGV2ZWw9MQorICAgICA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2FsaWFzIGJvb3N0ZG9jIDsKK2V4cGxpY2l0IGJvb3N0ZG9jIDsKK2FsaWFzIGJvb3N0cmVsZWFzZSA6CisgICAgc3RhbmRhbG9uZV9iYXNlX2Zyb21fbWVtYmVyIHN0YW5kYWxvbmVfY29tcHJlc3NlZF9wYWlyCisgICAgc3RhbmRhbG9uZV9kZWNsdmFsIHN0YW5kYWxvbmVfc3RyaW5nX3JlZiA7CitleHBsaWNpdCBib29zdHJlbGVhc2UgOwpkaWZmIC0tZ2l0IGEvZG9jL2Jhc2VfZnJvbV9tZW1iZXIucWJrIGIvZG9jL2Jhc2VfZnJvbV9tZW1iZXIucWJrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmQ5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvYmFzZV9mcm9tX21lbWJlci5xYmsKQEAgLTAsMCArMSwzNjMgQEAKK1svCisgIENvcHlyaWdodCAyMDAxLCAyMDAzLCAyMDA0LCAyMDEyIERhcnlsZSBXYWxrZXIuCisKKyAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorCisgIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQKKyAgb3IgY29weSBhdCBodHRwOi8vYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dAorXQorCitbYXJ0aWNsZSBCYXNlX0Zyb21fTWVtYmVyCisgICAgW3F1aWNrYm9vayAxLjVdCisgICAgW2F1dGhvcnMgW1dhbGtlciwgRGFyeWxlXV0KKyAgICBbY29weXJpZ2h0IDIwMDEsIDIwMDMsIDIwMDQsIDIwMTIgRGFyeWxlIFdhbGtlcl0KKyAgICBbbGljZW5zZQorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisgICAgICAgIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgICAgICAgW0BodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHRdKQorICAgIF0KK10KKworW3NlY3Rpb24gUmF0aW9uYWxlXQorCitXaGVuIGRldmVsb3BpbmcgYSBjbGFzcywgc29tZXRpbWVzIGEgYmFzZSBjbGFzcyBuZWVkcyB0byBiZSBpbml0aWFsaXplZAord2l0aCBhIG1lbWJlciBvZiB0aGUgY3VycmVudCBjbGFzcy4gQXMgYSBuYVx1MDBFRnZlIGV4YW1wbGU6CisKKyAgICAjaW5jbHVkZSA8c3RyZWFtYnVmPiAgLyogZm9yIHN0ZDo6c3RyZWFtYnVmICovCisgICAgI2luY2x1ZGUgPG9zdHJlYW0+ICAgIC8qIGZvciBzdGQ6Om9zdHJlYW0gKi8KKworICAgIGNsYXNzIGZkb3V0YnVmCisgICAgICA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IGZkb3V0YnVmKCBpbnQgZmQgKTsKKyAgICAgICAgLy8uLi4KKyAgICB9OworCisgICAgY2xhc3MgZmRvc3RyZWFtCisgICAgICA6IHB1YmxpYyBzdGQ6Om9zdHJlYW0KKyAgICB7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBmZG91dGJ1ZiBidWY7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBmZG9zdHJlYW0oIGludCBmZCApCisgICAgICAgICAgOiBidWYoIGZkICksIHN0ZDo6b3N0cmVhbSggJmJ1ZiApIHt9CisgICAgICAgIC8vLi4uCisgICAgfTsKKworVGhpcyBpcyB1bmRlZmluZWQgYmVjYXVzZSBDKysncyBpbml0aWFsaXphdGlvbiBvcmRlciBtYW5kYXRlcyB0aGF0IHRoZSBiYXNlCitjbGFzcyBpcyBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1lbWJlciBpdCB1c2VzLiBbQGh0dHA6Ly93d3cubW9vY2F0Lm9yZyBSLgorU2FtdWVsIEtsYXRjaGtvXSBkZXZlbG9wZWQgYSB3YXkgYXJvdW5kIHRoaXMgYnkgdXNpbmcgdGhlIGluaXRpYWxpemF0aW9uCitvcmRlciBpbiBoaXMgZmF2b3IuIEJhc2UgY2xhc3NlcyBhcmUgaW50aWFsaXplZCBpbiBvcmRlciBvZiBkZWNsYXJhdGlvbiwgc28KK21vdmluZyB0aGUgZGVzaXJlZCBtZW1iZXIgdG8gYW5vdGhlciBiYXNlIGNsYXNzLCB0aGF0IGlzIGluaXRpYWxpemVkIGJlZm9yZQordGhlIGRlc2lyZWQgYmFzZSBjbGFzcywgY2FuIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24uCisKK0EgY3VzdG9tIGJhc2UgY2xhc3MgY2FuIGJlIG1hZGUgZm9yIHRoaXMgaWRpb206CisKKyAgICAjaW5jbHVkZSA8c3RyZWFtYnVmPiAgLyogZm9yIHN0ZDo6c3RyZWFtYnVmICovCisgICAgI2luY2x1ZGUgPG9zdHJlYW0+ICAgIC8qIGZvciBzdGQ6Om9zdHJlYW0gKi8KKworICAgIGNsYXNzIGZkb3V0YnVmCisgICAgICA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IGZkb3V0YnVmKCBpbnQgZmQgKTsKKyAgICAgICAgLy8uLi4KKyAgICB9OworCisgICAgc3RydWN0IGZkb3N0cmVhbV9wYmFzZQorICAgIHsKKyAgICAgICAgZmRvdXRidWYgc2J1ZmZlcjsKKworICAgICAgICBleHBsaWNpdCBmZG9zdHJlYW1fcGJhc2UoIGludCBmZCApCisgICAgICAgICAgOiBzYnVmZmVyKCBmZCApIHt9CisgICAgfTsKKworICAgIGNsYXNzIGZkb3N0cmVhbQorICAgICAgOiBwcml2YXRlIGZkb3N0cmVhbV9wYmFzZQorICAgICAgLCBwdWJsaWMgc3RkOjpvc3RyZWFtCisgICAgeworICAgICAgICB0eXBlZGVmIGZkb3N0cmVhbV9wYmFzZSAgcGJhc2VfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6Om9zdHJlYW0gICAgIGJhc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgZmRvc3RyZWFtKCBpbnQgZmQgKQorICAgICAgICAgIDogcGJhc2VfdHlwZSggZmQgKSwgYmFzZV90eXBlKCAmc2J1ZmZlciApIHt9CisgICAgICAgIC8vLi4uCisgICAgfTsKKworT3RoZXIgcHJvamVjdHMgY2FuIHVzZSBzaW1pbGFyIGN1c3RvbSBiYXNlIGNsYXNzZXMuIFRoZSB0ZWNobmlxdWUgaXMgYmFzaWMKK2Vub3VnaCB0byBtYWtlIGEgdGVtcGxhdGUsIHdpdGggYSBzYW1wbGUgdGVtcGxhdGUgY2xhc3MgaW4gdGhpcyBsaWJyYXJ5LgorVGhlIG1haW4gdGVtcGxhdGUgcGFyYW1ldGVyIGlzIHRoZSB0eXBlIG9mIHRoZSBlbmNsb3NlZCBtZW1iZXIuIFRoZQordGVtcGxhdGUgY2xhc3MgaGFzIHNldmVyYWwgKGV4cGxpY2l0KSBjb25zdHJ1Y3RvciBtZW1iZXIgdGVtcGxhdGVzLCB3aGljaAoraW1wbGljaXRseSB0eXBlIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgYW5kIHBhc3MgdGhlbSB0byB0aGUgbWVtYmVyLiBUaGUKK3RlbXBsYXRlIGNsYXNzIHVzZXMgaW1wbGljaXQgY29weSBjb25zdHJ1Y3Rpb24gYW5kIGFzc2lnbm1lbnQsIGNhbmNlbGxpbmcKK3RoZW0gaWYgdGhlIGVuY2xvc2VkIG1lbWJlciBpcyBub24tY29weWFibGUuCisKK01hbnVhbGx5IGNvZGluZyBhIGJhc2UgY2xhc3MgbWF5IGJlIGJldHRlciBpZiB0aGUgY29uc3RydWN0aW9uIGFuZC9vcgorY29weWluZyBuZWVkcyBhcmUgdG9vIGNvbXBsZXggZm9yIHRoZSBzdXBwbGllZCB0ZW1wbGF0ZSBjbGFzcywgb3IgaWYgdGhlCitjb21waWxlciBpcyBub3QgYWR2YW5jZWQgZW5vdWdoIHRvIHVzZSBpdC4KKworU2luY2UgYmFzZSBjbGFzc2VzIGFyZSB1bm5hbWVkLCBhIGNsYXNzIGNhbm5vdCBoYXZlIG11bHRpcGxlIChkaXJlY3QpIGJhc2UKK2NsYXNzZXMgb2YgdGhlIHNhbWUgdHlwZS4gVGhlIHN1cHBsaWVkIHRlbXBsYXRlIGNsYXNzIGhhcyBhbiBleHRyYSB0ZW1wbGF0ZQorcGFyYW1ldGVyLCBhbiBpbnRlZ2VyLCB0aGF0IGV4aXN0cyBzb2xlbHkgdG8gcHJvdmlkZSB0eXBlIGRpZmZlcmVudGlhdGlvbi4KK1RoaXMgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUgc28gYSBzaW5nbGUgdXNlIG9mIGEgcGFydGljdWxhciBtZW1iZXIKK3R5cGUgZG9lcyBub3QgbmVlZCB0byBjb25jZXJuIGl0c2VsZiB3aXRoIHRoZSBpbnRlZ2VyLgorCitbZW5kc2VjdF0KKworW3NlY3Rpb24gU3lub3BzaXNdCisKKyAgICAjaW5jbHVkZSA8dHlwZV90cmFpdHM+ICAvKiBleHBvc2l0aW9uIG9ubHkgKi8KKworICAgICNpZm5kZWYgQk9PU1RfQkFTRV9GUk9NX01FTUJFUl9NQVhfQVJJVFkKKyAgICAjZGVmaW5lIEJPT1NUX0JBU0VfRlJPTV9NRU1CRVJfTUFYX0FSSVRZICAxMAorICAgICNlbmRpZgorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBNZW1iZXJUeXBlLCBpbnQgVW5pcXVlSUQgPSAwID4KKyAgICBjbGFzcyBib29zdDo6YmFzZV9mcm9tX21lbWJlcgorICAgIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIE1lbWJlclR5cGUgIG1lbWJlcjsKKworICAgICNpZiBgYFsnQysrMTEgaXMgaW4gdXNlXWBgCisgICAgICAgIHRlbXBsYXRlPCB0eXBlbmFtZSAuLi5UID4KKyAgICAgICAgZXhwbGljaXQgY29uc3RleHByICAgYmFzZV9mcm9tX21lbWJlciggVCYmIC4uLnggKQorICAgICAgICAgbm9leGNlcHQoIHN0ZDo6aXNfbm90aHJvd19jb25zdHJ1Y3RpYmxlPE1lbWJlclR5cGUsIFQuLi4+Ojp2YWx1ZSApOworICAgICNlbHNlCisgICAgICAgIGJhc2VfZnJvbV9tZW1iZXIoKTsKKworICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVDEgPgorICAgICAgICBleHBsaWNpdCAgYmFzZV9mcm9tX21lbWJlciggVDEgeDEgKTsKKworICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICAgICAgYmFzZV9mcm9tX21lbWJlciggVDEgeDEsIFQyIHgyICk7CisKKyAgICAgICAgLy8uLi4KKworICAgICAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBUMywgdHlwZW5hbWUgVDQsCisgICAgICAgICB0eXBlbmFtZSBUNSwgdHlwZW5hbWUgVDYsIHR5cGVuYW1lIFQ3LCB0eXBlbmFtZSBUOCwgdHlwZW5hbWUgVDksCisgICAgICAgICB0eXBlbmFtZSBUMTAgPgorICAgICAgICBiYXNlX2Zyb21fbWVtYmVyKCBUMSB4MSwgVDIgeDIsIFQzIHgzLCBUNCB4NCwgVDUgeDUsIFQ2IHg2LCBUNyB4NywKKyAgICAgICAgIFQ4IHg4LCBUOSB4OSwgVDEwIHgxMCApOworICAgICNlbmRpZgorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIE1lbWJlclR5cGUsIGludCBVbmlxdWVJRCA+CisgICAgY2xhc3MgYmFzZV9mcm9tX21lbWJlcjxNZW1iZXJUeXBlJiwgVW5pcXVlSUQ+CisgICAgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgTWVtYmVyVHlwZSYgbWVtYmVyOworCisgICAgICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBiYXNlX2Zyb21fbWVtYmVyKCBNZW1iZXJUeXBlJiB4ICkKKyAgICAgICAgICAgIG5vZXhjZXB0OworICAgIH07CisKK1RoZSBjbGFzcyB0ZW1wbGF0ZSBoYXMgYSBmaXJzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgYE1lbWJlclR5cGVgIHJlcHJlc2VudGluZwordGhlIHR5cGUgb2YgdGhlIGJhc2VkLW1lbWJlci4gSXQgaGFzIGEgbGFzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgYFVuaXF1ZUlEYCwKK3RoYXQgaXMgYW4gYGludGAsIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgdGhhdCB1c2UKK3RoZSBzYW1lIGJhc2VkLW1lbWJlciB0eXBlLiBUaGUgbGFzdCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZQorb2YgemVybyBpZiBpdCBpcyBvbWl0dGVkLiBUaGUgY2xhc3MgdGVtcGxhdGUgaGFzIGEgcHJvdGVjdGVkIGRhdGEgbWVtYmVyCitjYWxsZWQgYG1lbWJlcmAgdGhhdCB0aGUgZGVyaXZlZCBjbGFzcyBjYW4gdXNlIGZvciBsYXRlciBiYXNlIGNsYXNzZXMgKG9yCitpdHNlbGYpLgorCitJZiB0aGUgYXBwcm9wcmlhdGUgZmVhdHVyZXMgb2YgQysrMTEgYXJlIHByZXNlbnQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUKK2NvbnN0cnVjdG9yIHRlbXBsYXRlLiBJdCBpbXBsZW1lbnRzIFsncGVyZmVjdCBmb3J3YXJkaW5nXSB0byB0aGUgYmVzdAorY29uc3RydWN0b3IgY2FsbCBvZiBgbWVtYmVyYCAoaWYgYW55KS4gVGhlIGNvbnN0cnVjdG9yIHRlbXBsYXRlIGlzIG1hcmtlZAorYm90aCBgY29uc3RleHByYCBhbmQgYGV4cGxpY2l0YC4gVGhlIGZvcm1lciB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlCitjb3JyZXNwb25kaW5nIGlubmVyIGNvbnN0cnVjdG9yIGNhbGwgKG9mIGBtZW1iZXJgKSBkb2VzIG5vdCBoYXZlIHRoZSBtYXJrZXIuCitUaGUgbGF0dGVyIGJpbmRzIHRoZSBvdGhlciB3YXk7IGFsd2F5cyB0YWtpbmcgZWZmZWN0LCBldmVuIHdoZW4gdGhlIGlubmVyCitjb25zdHJ1Y3RvciBjYWxsIGRvZXMgbm90IGhhdmUgdGhlIG1hcmtlci4gVGhlIGNvbnN0cnVjdG9yIHRlbXBsYXRlCitwcm9wYWdhdGVzIHRoZSBgbm9leGNlcHRgIHN0YXR1cyBvZiB0aGUgaW5uZXIgY29uc3RydWN0b3IgY2FsbC4gKFRoZQorY29uc3RydWN0b3IgdGVtcGxhdGUgaGFzIGEgdHJhaWxpbmcgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlIHRoYXQKK2Rpc2FibGVzIHRoZSB0ZW1wbGF0ZSB3aGVuIGl0cyBzaWduYXR1cmUgaXMgdG9vIGNsb3NlIHRvIHRoZSBzaWduYXR1cmVzIG9mCit0aGUgYXV0b21hdGljYWxseS1kZWZpbmVkIG5vbi10ZW1wbGF0ZSBjb3B5LSBhbmQvb3IgbW92ZS1jb25zdHJ1Y3RvcnMgb2YKK2BiYXNlX2Zyb21fbWVtYmVyYC4pCisKK09uIGVhcmxpZXItc3RhbmRhcmQgY29tcGlsZXJzLCB0aGVyZSBpcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIHNldmVyYWwKK2NvbnN0cnVjdG9yIG1lbWJlciB0ZW1wbGF0ZXMuIFRoZXNlIGNvbnN0cnVjdG9yIHRlbXBsYXRlcyBjYW4gdGFrZSBhcyBtYW55Cithcmd1bWVudHMgKGN1cnJlbnRseSB1cCB0byB0ZW4pIGFzIHBvc3NpYmxlIGFuZCBwYXNzIHRoZW0gdG8gYSBjb25zdHJ1Y3Rvcgorb2YgdGhlIGRhdGEgbWVtYmVyLgorCitBIHNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgcmVmZXJlbmNlcyBvZmZlcnMgYSBzaW5nbGUgY29uc3RydWN0b3IgdGFraW5nCithIGBNZW1iZXJUeXBlJmAsIHdoaWNoIGlzIHRoZSBvbmx5IHdheSB0byBpbml0aWFsaXplIGEgcmVmZXJlbmNlLgorCitTaW5jZSBDKysgZG9lcyBub3QgYWxsb3cgYW55IHdheSB0byBleHBsaWNpdGx5IHN0YXRlIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCitvZiBhIHRlbXBsYXRlZCBjb25zdHJ1Y3RvciwgbWFrZSBzdXJlIHRoYXQgdGhlIGFyZ3VtZW50cyBhcmUgYWxyZWFkeSBjbG9zZQorYXMgcG9zc2libGUgdG8gdGhlIGFjdHVhbCB0eXBlIHVzZWQgaW4gdGhlIGRhdGEgbWVtYmVyJ3MgZGVzaXJlZCBjb25zdHJ1Y3Rvci4KK0V4cGxpY2l0IGNvbnZlcnNpb25zIG1heSBiZSBuZWNlc3NhcnkuCisKK1RoZSBgQk9PU1RfQkFTRV9GUk9NX01FTUJFUl9NQVhfQVJJVFlgIG1hY3JvIGNvbnN0YW50IHNwZWNpZmllcyB0aGUgbWF4aW11bQorYXJndW1lbnQgbGVuZ3RoIGZvciB0aGUgY29uc3RydWN0b3IgdGVtcGxhdGVzLiBUaGUgY29uc3RhbnQgbWF5IGJlIG92ZXJyaWRkZW4KK2lmIG1vcmUgKG9yIGxlc3MpIGFyZ3VtZW50IGNvbmZpZ3VyYXRpb25zIGFyZSBuZWVkZWQuIFRoZSBjb25zdGFudCBtYXkgYmUKK3JlYWQgZm9yIGNvZGUgdGhhdCBpcyBleHBhbmRhYmxlIGxpa2UgdGhlIGNsYXNzIHRlbXBsYXRlIGFuZCBuZWVkcyB0bworbWFpbnRhaW4gdGhlIHNhbWUgbWF4aW11bSBzaXplLiAoRXhhbXBsZSBjb2RlIHdvdWxkIGJlIGEgY2xhc3MgdGhhdCB1c2VzCit0aGlzIGNsYXNzIHRlbXBsYXRlIGFzIGEgYmFzZSBjbGFzcyBmb3IgYSBtZW1iZXIgd2l0aCBhIGZsZXhpYmxlIHNldCBvZgorY29uc3RydWN0b3JzLikgVGhpcyBjb25zdGFudCBpcyBpZ25vcmVkIHdoZW4gQysrMTEgZmVhdHVyZXMgYXJlIHByZXNlbnQuCisKK1tlbmRzZWN0XQorCitbc2VjdGlvbiBVc2FnZV0KKworV2l0aCB0aGUgc3RhcnRpbmcgZXhhbXBsZSwgdGhlIGBmZG91dGJ1ZmAgc3ViLW9iamVjdCBuZWVkcyB0byBiZQorZW5jYXBzdWxhdGVkIGluIGEgYmFzZSBjbGFzcyB0aGF0IGlzIGluaGVpcml0ZWQgYmVmb3JlIGBzdGQ6Om9zdHJlYW1gLgorCisgICAgI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvYmFzZV9mcm9tX21lbWJlci5ocHA+CisKKyAgICAjaW5jbHVkZSA8c3RyZWFtYnVmPiAgLy8gZm9yIHN0ZDo6c3RyZWFtYnVmCisgICAgI2luY2x1ZGUgPG9zdHJlYW0+ICAgIC8vIGZvciBzdGQ6Om9zdHJlYW0KKworICAgIGNsYXNzIGZkb3V0YnVmCisgICAgICA6IHB1YmxpYyBzdGQ6OnN0cmVhbWJ1ZgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IGZkb3V0YnVmKCBpbnQgZmQgKTsKKyAgICAgICAgLy8uLi4KKyAgICB9OworCisgICAgY2xhc3MgZmRvc3RyZWFtCisgICAgICA6IHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8ZmRvdXRidWY+CisgICAgICAsIHB1YmxpYyBzdGQ6Om9zdHJlYW0KKyAgICB7CisgICAgICAgIC8vIEhlbHBlciB0eXBlZGVmJ3MKKyAgICAgICAgdHlwZWRlZiBib29zdDo6YmFzZV9mcm9tX21lbWJlcjxmZG91dGJ1Zj4gIHBiYXNlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgc3RkOjpvc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBmZG9zdHJlYW0oIGludCBmZCApCisgICAgICAgICAgOiBwYmFzZV90eXBlKCBmZCApLCBiYXNlX3R5cGUoICZtZW1iZXIgKXt9CisgICAgICAgIC8vLi4uCisgICAgfTsKKworVGhlIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20gaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCBzbyBpdCBzaG91bGQgbm90CitiZSB2aXNpYmxlIHRvIHRoZSBjbGllbnRzIChvciBhbnkgZGVyaXZlZCBjbGFzc2VzKSBvZiBgZmRvc3RyZWFtYC4gRHVlIHRvCit0aGUgaW5pdGlhbGl6YXRpb24gb3JkZXIsIHRoZSBgZmRvdXRidWZgIHN1Yi1vYmplY3Qgd2lsbCBnZXQgaW5pdGlhbGl6ZWQKK2JlZm9yZSB0aGUgYHN0ZDo6b3N0cmVhbWAgc3ViLW9iamVjdCBkb2VzLCBtYWtpbmcgdGhlIGZvcm1lciBzdWItb2JqZWN0CitzYWZlIHRvIHVzZSBpbiB0aGUgbGF0dGVyIHN1Yi1vYmplY3QncyBjb25zdHJ1Y3Rpb24uIFNpbmNlIHRoZSBgZmRvdXRidWZgCitzdWItb2JqZWN0IG9mIHRoZSBmaW5hbCB0eXBlIGlzIHRoZSBvbmx5IHN1Yi1vYmplY3Qgd2l0aCB0aGUgbmFtZSBgbWVtYmVyYAordGhhdCBuYW1lIGNhbiBiZSB1c2VkIHVucXVhbGlmaWVkIHdpdGhpbiB0aGUgZmluYWwgY2xhc3MuCisKK1tlbmRzZWN0XQorCitbc2VjdGlvbiBFeGFtcGxlXQorCitUaGUgYmFzZS1mcm9tLW1lbWJlciBjbGFzcyB0ZW1wbGF0ZXMgc2hvdWxkIGNvbW1vbmx5IGludm9sdmUgb25seSBvbmUKK2Jhc2UtZnJvbS1tZW1iZXIgc3ViLW9iamVjdCwgdXN1YWxseSBmb3IgYXR0YWNoaW5nIGEgc3RyZWFtLWJ1ZmZlciB0byBhbgorSS9PIHN0cmVhbS4gVGhlIG5leHQgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBtdWx0aXBsZQorYmFzZS1mcm9tLW1lbWJlciBzdWItb2JqZWN0cyBhbmQgdGhlIHJlc3VsdGluZyBxdWFsaWZpY2F0aW9uIGlzc3Vlcy4KKworICAgICNpbmNsdWRlIDxib29zdC91dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwPgorCisgICAgI2luY2x1ZGUgPGNzdGRkZWY+ICAvKiBmb3IgTlVMTCAqLworCisgICAgc3RydWN0IGFuX2ludAorICAgIHsKKyAgICAgICAgaW50ICB5OworCisgICAgICAgIGFuX2ludCggZmxvYXQgeWYgKTsKKyAgICB9OworCisgICAgY2xhc3Mgc3dpdGNoZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBzd2l0Y2hlcigpOworICAgICAgICBzd2l0Y2hlciggZG91YmxlLCBpbnQgKiApOworICAgICAgICAvLy4uLgorICAgIH07CisKKyAgICBjbGFzcyBmbG93X3JlZ3VsYXRvcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGZsb3dfcmVndWxhdG9yKCBzd2l0Y2hlciAmLCBzd2l0Y2hlciAmICk7CisgICAgICAgIC8vLi4uCisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdW5zaWduZWQgU2l6ZSA+CisgICAgY2xhc3MgZmFuCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgZmFuKCBzd2l0Y2hlciApOworICAgICAgICAvLy4uLgorICAgIH07CisKKyAgICBjbGFzcyBzeXN0ZW0KKyAgICAgIDogcHJpdmF0ZSBib29zdDo6YmFzZV9mcm9tX21lbWJlcjxhbl9pbnQ+CisgICAgICAsIHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8c3dpdGNoZXI+CisgICAgICAsIHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8c3dpdGNoZXIsIDE+CisgICAgICAsIHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8c3dpdGNoZXIsIDI+CisgICAgICAsIHByb3RlY3RlZCBmbG93X3JlZ3VsYXRvcgorICAgICAgLCBwdWJsaWMgZmFuPDY+CisgICAgeworICAgICAgICAvLyBIZWxwZXIgdHlwZWRlZidzCisgICAgICAgIHR5cGVkZWYgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8YW5faW50PiAgICAgICBwYmFzZTBfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBib29zdDo6YmFzZV9mcm9tX21lbWJlcjxzd2l0Y2hlcj4gICAgIHBiYXNlMV90eXBlOworICAgICAgICB0eXBlZGVmIGJvb3N0OjpiYXNlX2Zyb21fbWVtYmVyPHN3aXRjaGVyLCAxPiAgcGJhc2UyX3R5cGU7CisgICAgICAgIHR5cGVkZWYgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8c3dpdGNoZXIsIDI+ICBwYmFzZTNfdHlwZTsKKworICAgICAgICB0eXBlZGVmIGZsb3dfcmVndWxhdG9yICBiYXNlMV90eXBlOworICAgICAgICB0eXBlZGVmIGZhbjw2PiAgICAgICAgICBiYXNlMl90eXBlOworCisgICAgcHVibGljOgorICAgICAgICBzeXN0ZW0oIGRvdWJsZSB4ICk7CisgICAgICAgIC8vLi4uCisgICAgfTsKKworICAgIHN5c3RlbTo6c3lzdGVtKCBkb3VibGUgeCApCisgICAgICA6IHBiYXNlMF90eXBlKCAwLjIgKQorICAgICAgLCBwYmFzZTFfdHlwZSgpCisgICAgICAsIHBiYXNlMl90eXBlKCAtMTYsICZ0aGlzLT5wYmFzZTBfdHlwZTo6bWVtYmVyLnkgKQorICAgICAgLCBwYmFzZTNfdHlwZSggeCwgc3RhdGljX2Nhc3Q8aW50ICo+KE5VTEwpICkKKyAgICAgICwgYmFzZTFfdHlwZSggcGJhc2UzX3R5cGU6Om1lbWJlciwgcGJhc2UxX3R5cGU6Om1lbWJlciApCisgICAgICAsIGJhc2UyX3R5cGUoIHBiYXNlMl90eXBlOjptZW1iZXIgKQorICAgIHsKKyAgICAgICAgLy8uLi4KKyAgICB9CisKK1RoZSBmaW5hbCBjbGFzcyBoYXMgbXVsdGlwbGUgc3ViLW9iamVjdHMgd2l0aCB0aGUgbmFtZSBgbWVtYmVyYCwgc28gYW55Cit1c2Ugb2YgdGhhdCBuYW1lIG5lZWRzIHF1YWxpZmljYXRpb24gYnkgYSBuYW1lIG9mIHRoZSBhcHByb3ByaWF0ZSBiYXNlCit0eXBlLiAoVXNpbmcgYHR5cGVkZWZgcyBlYXNlIG1lbnRpb25pbmcgdGhlIGJhc2UgdHlwZXMuKSBIb3dldmVyLCB0aGUgZml4CitpbnRyb2R1Y2VzIGEgbmV3IHByb2JsZW0gd2hlbiBhIHBvaW50ZXIgaXMgbmVlZGVkLiBVc2luZyB0aGUgYWRkcmVzcworb3BlcmF0b3Igd2l0aCBhIHN1Yi1vYmplY3QgcXVhbGlmaWVkIHdpdGggaXRzIGNsYXNzJ3MgbmFtZSByZXN1bHRzIGluIGEKK3BvaW50ZXItdG8tbWVtYmVyIChoZXJlLCBoYXZpbmcgYSB0eXBlIG9mIGBhbl9pbnQgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8Cithbl9pbnQsIDA+IDo6ICpgKSBpbnN0ZWFkIG9mIGEgcG9pbnRlciB0byB0aGUgbWVtYmVyIChoYXZpbmcgYSB0eXBlIG9mCitgYW5faW50ICpgKS4gVGhlIG5ldyBwcm9ibGVtIGlzIGZpeGVkIGJ5IHF1YWxpZnlpbmcgdGhlIHN1Yi1vYmplY3Qgd2l0aAorYHRoaXMtPmAgYW5kIGlzIG5lZWRlZCBqdXN0IGZvciBwb2ludGVycywgYW5kIG5vdCBmb3IgcmVmZXJlbmNlcyBvciB2YWx1ZXMuCisKK1RoZXJlIGFyZSBzb21lIGFyZ3VtZW50IGNvbnZlcnNpb25zIGluIHRoZSBpbml0aWFsaXphdGlvbi4gVGhlIGNvbnN0cnVjdG9yCithcmd1bWVudCBmb3IgYHBiYXNlMF90eXBlYCBpcyBjb252ZXJ0ZWQgZnJvbSBgZG91YmxlYCB0byBgZmxvYXRgLiBUaGUgZmlyc3QKK2NvbnN0cnVjdG9yIGFyZ3VtZW50IGZvciBgcGJhc2UyX3R5cGVgIGlzIGNvbnZlcnRlZCBmcm9tIGBpbnRgIHRvIGBkb3VibGVgLgorVGhlIHNlY29uZCBjb25zdHJ1Y3RvciBhcmd1bWVudCBmb3IgYHBiYXNlM190eXBlYCBpcyBhIHNwZWNpYWwgY2FzZSBvZgorbmVjZXNzYXJ5IGNvbnZlcnNpb247IGFsbCBmb3JtcyBvZiB0aGUgbnVsbC1wb2ludGVyIGxpdGVyYWwgaW4gQysrIChleGNlcHQKK2BudWxscHRyYCBmcm9tIEMrKzExKSBhbHNvIGxvb2sgbGlrZSBjb21waWxlLXRpbWUgaW50ZWdyYWwgZXhwcmVzc2lvbnMsIHNvCitDKysgYWx3YXlzIGludGVycHJldHMgc3VjaCBjb2RlIGFzIGFuIGludGVnZXIgd2hlbiBpdCBoYXMgb3ZlcmxvYWRzIHRoYXQgY2FuCit0YWtlIGVpdGhlciBhbiBpbnRlZ2VyIG9yIGEgcG9pbnRlci4gVGhlIGxhc3QgY29udmVyc2lvbiBpcyBuZWNlc3NhcnkgZm9yIHRoZQorY29tcGlsZXIgdG8gY2FsbCBhIGNvbnN0cnVjdG9yIGZvcm0gd2l0aCB0aGUgZXhhY3QgcG9pbnRlciB0eXBlIHVzZWQgaW4KK2Bzd2l0Y2hlcmAncyBjb25zdHJ1Y3Rvci4gKElmIEMrKzExJ3MgYG51bGxwdHJgIGlzIHVzZWQsIGl0IHN0aWxsIG5lZWRzIGEKK2NvbnZlcnNpb24gaWYgbXVsdGlwbGUgcG9pbnRlciB0eXBlcyBjYW4gYmUgYWNjZXB0ZWQgaW4gYSBjb25zdHJ1Y3RvciBjYWxsCitidXQgYHN0ZDo6bnVsbHB0cl90YCBjYW5ub3QuKQorCitbZW5kc2VjdF0KKworW3NlY3Rpb24gQWNrbm93bGVkZ21lbnRzXQorCisqIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2VkX2JyZXkuaHRtIEVkIEJyZXldIHN1Z2dlc3RlZCBzb21lIGludGVyZmFjZQorY2hhbmdlcy4KKworKiBbQGh0dHA6Ly93d3cubW9vY2F0Lm9yZyBSLiBTYW11ZWwgS2xhdGNoa29dIChbQG1haWx0bzpyc2tAbW9vY2F0Lm9yZworcnNrQG1vb2NhdC5vcmddLCBbQG1haWx0bzpyc2tAYnJpZ2h0bWFpbC5jb20gcnNrQGJyaWdodG1haWwuY29tXSkgaW52ZW50ZWQKK3RoZSBpZGlvbSBvZiBob3cgdG8gdXNlIGEgY2xhc3MgbWVtYmVyIGZvciBpbml0aWFsaXppbmcgYSBiYXNlIGNsYXNzLgorCisqIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2RpZXRtYXJfa3VlaGwuaHRtIERpZXRtYXIgS3VlaGxdIHBvcHVsYXJpemVkIHRoZQorIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20gaW4gaGlzIFtAaHR0cDovL3d3dy5pbmZvcm1hdGlrLnVuaS1rb25zdGFuei5kZS9+a3VlaGwvYysrL2lvc3RyZWFtLworICBJT1N0cmVhbSBleGFtcGxlIGNsYXNzZXNdLgorCisqIEpvbmF0aGFuIFR1cmthbmlzIHN1cHBsaWVkIGFuIGltcGxlbWVudGF0aW9uIG9mIGdlbmVyYXRpbmcgdGhlIGNvbnN0cnVjdG9yCit0ZW1wbGF0ZXMgdGhhdCBjYW4gYmUgY29udHJvbGxlZCBhbmQgYXV0b21hdGVkIHdpdGggbWFjcm9zLiBUaGUKK2ltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFtALi4vLi4vLi4vcHJlcHJvY2Vzc29yL2luZGV4Lmh0bWwgUHJlcHJvY2Vzc29yIGxpYnJhcnldLgorCisqIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2RhcnlsZV93YWxrZXIuaHRtbCI+RGFyeWxlIFdhbGtlcl0gc3RhcnRlZCB0aGUKK2xpYnJhcnkuIENvbnRyaWJ1dGVkIHRoZSB0ZXN0IGZpbGUgW0AuLi8uLi9iYXNlX2Zyb21fbWVtYmVyX3Rlc3QuY3BwCitiYXNlX2Zyb21fbWVtYmVyX3Rlc3QuY3BwXS4KKworW2VuZHNlY3RdCisKZGlmZiAtLWdpdCBhL2RvYy9jb21wcmVzc2VkX3BhaXIucWJrIGIvZG9jL2NvbXByZXNzZWRfcGFpci5xYmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjNDI2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb21wcmVzc2VkX3BhaXIucWJrCkBAIC0wLDAgKzEsOTkgQEAKK1svCisgIENvcHlyaWdodCAyMDAwIEJlbWFuIERhd2VzICYgSm9obiBNYWRkb2NrLgorCisgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKworICBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0CisgIG9yIGNvcHkgYXQgaHR0cDovL2Jvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQKK10KKworW2FydGljbGUgQ29tcHJlc3NlZF9QYWlyCisgICAgW3F1aWNrYm9vayAxLjVdCisgICAgW2F1dGhvcnMgW0NsZWFyeSwgU3RldmVdXQorICAgIFthdXRob3JzIFtEYXdlcywgQmVtYW5dXQorICAgIFthdXRob3JzIFtIaW5uYW50LCBIb3dhcmRdXQorICAgIFthdXRob3JzIFtNYWRkb2NrLCBKb2huXV0KKyAgICBbY29weXJpZ2h0IDIwMDAgU3RldmUgQ2xlYXJ5LCBCZW1hbiBEYXdlcywgSG93YXJkIEhpbm5hbnQgJmFtcDsgSm9obiBNYWRkb2NrXQorICAgIFtsaWNlbnNlCisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgICAgICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgICAgICBbQGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dF0pCisgICAgXQorXQorCitbc2VjdGlvbiBPdmVydmlld10KKworQWxsIG9mIHRoZSBjb250ZW50cyBvZiBgPGJvb3N0L2NvbXByZXNzZWRfcGFpci5ocHA+YCBhcmUgZGVmaW5lZCBpbnNpZGUKK2BuYW1lc3BhY2UgYm9vc3RgLgorCitUaGUgY2xhc3MgYGNvbXByZXNzZWRfcGFpcmAgaXMgdmVyeSBzaW1pbGFyIHRvIGBzdGQ6OnBhaXJgLCBidXQgaWYgZWl0aGVyIG9mCit0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBlbXB0eSBjbGFzc2VzLCB0aGVuIHRoZSBbJ2VtcHR5IGJhc2UtY2xhc3MKK29wdGltaXNhdGlvbl0gaXMgYXBwbGllZCB0byBjb21wcmVzcyB0aGUgc2l6ZSBvZiB0aGUgcGFpci4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uIFN5bm9wc2lzXQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgICBjbGFzcyBjb21wcmVzc2VkX3BhaXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICAgICAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpyZWZlcmVuY2UgICAgICAgc2Vjb25kX3JlZmVyZW5jZTsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXIoKSA6IGJhc2UoKSB7fQorICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXIoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KTsKKyAgICAgICAgZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyKGZpcnN0X3BhcmFtX3R5cGUgeCk7CisgICAgICAgIGV4cGxpY2l0IGNvbXByZXNzZWRfcGFpcihzZWNvbmRfcGFyYW1fdHlwZSB5KTsKKworICAgICAgICBjb21wcmVzc2VkX3BhaXImIG9wZXJhdG9yPShjb25zdCBjb21wcmVzc2VkX3BhaXImKTsKKworICAgICAgICBmaXJzdF9yZWZlcmVuY2UgICAgICAgZmlyc3QoKTsKKyAgICAgICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3Q7CisKKyAgICAgICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKTsKKyAgICAgICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdDsKKworICAgICAgICB2b2lkIHN3YXAoY29tcHJlc3NlZF9wYWlyJiB5KTsKKyAgICB9OworCitUaGUgdHdvIG1lbWJlcnMgb2YgdGhlIHBhaXIgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBtZW1iZXIgZnVuY3Rpb25zCitgZmlyc3QoKWAgYW5kIGBzZWNvbmQoKWAuIE5vdGUgdGhhdCBub3QgYWxsIG1lbWJlciBmdW5jdGlvbnMgY2FuIGJlCitpbnN0YW50aWF0ZWQgZm9yIGFsbCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuIEluIHBhcnRpY3VsYXIKK2Bjb21wcmVzc2VkX3BhaXJgIGNhbiBiZSBpbnN0YW50aWF0ZWQgZm9yIHJlZmVyZW5jZSBhbmQgYXJyYXkgdHlwZXMsCitob3dldmVyIGluIHRoZXNlIGNhc2VzIHRoZSByYW5nZSBvZiBjb25zdHJ1Y3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBhcmUKK2xpbWl0ZWQuIElmIHR5cGVzIGBUMWAgYW5kIGBUMmAgYXJlIHRoZSBzYW1lIHR5cGUsIHRoZW4gdGhlcmUgaXMgb25seQorb25lIHZlcnNpb24gb2YgdGhlIHNpbmdsZS1hcmd1bWVudCBjb25zdHJ1Y3RvciwgYW5kIHRoaXMgY29uc3RydWN0b3IKK2luaXRpYWxpc2VzIGJvdGggdmFsdWVzIGluIHRoZSBwYWlyIHRvIHRoZSBwYXNzZWQgdmFsdWUuCisKK05vdGUgdGhhdCBpZiBlaXRoZXIgbWVtYmVyIGlzIGEgUE9EIHR5cGUsIHRoZW4gdGhhdCBtZW1iZXIgaXMgbm90Cit6ZXJvLWluaXRpYWxpemVkIGJ5IHRoZSBgY29tcHJlc3NlZF9wYWlyYCBkZWZhdWx0IGNvbnN0cnVjdG9yOiBpdCdzIHVwCit0byB5b3UgdG8gc3VwcGx5IGFuIGluaXRpYWwgdmFsdWUgZm9yIHRoZXNlIHR5cGVzIGlmIHlvdSB3YW50IHRoZW0gdG8gaGF2ZQorYSBkZWZhdWx0IHZhbHVlLgorCitOb3RlIHRoYXQgYGNvbXByZXNzZWRfcGFpcmAgY2FuIG5vdCBiZSBpbnN0YW50aWF0ZWQgaWYgZWl0aGVyIG9mIHRoZQordGVtcGxhdGUgYXJndW1lbnRzIGlzIGEgdW5pb24gdHlwZSwgdW5sZXNzIHRoZXJlIGlzIGNvbXBpbGVyIHN1cHBvcnQgZm9yCitgYm9vc3Q6OmlzX3VuaW9uYCwgb3IgaWYgYGJvb3N0Ojppc191bmlvbmAgaXMgc3BlY2lhbGlzZWQgZm9yIHRoZSB1bmlvbgordHlwZS4KKworRmluYWxseSwgYSB3b3JkIG9mIGNhdXRpb24gZm9yIFZpc3VhbCBDKysgNiB1c2VyczogaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGFuCitlbXB0eSB0eXBlLCB0aGVuIGFzc2lnbmluZyB0byB0aGF0IG1lbWJlciB3aWxsIHByb2R1Y2UgbWVtb3J5IGNvcnJ1cHRpb24sCit1bmxlc3MgdGhlIGVtcHR5IHR5cGUgaGFzIGEgImRvIG5vdGhpbmciIGFzc2lnbm1lbnQgb3BlcmF0b3IgZGVmaW5lZC4gVGhpcworaXMgZHVlIHRvIGEgYnVnIGluIHRoZSB3YXkgVkM2IGdlbmVyYXRlcyBpbXBsaWNpdCBhc3NpZ25tZW50IG9wZXJhdG9ycy4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uIEFja25vd2xlZGdtZW50c10KKworQmFzZWQgb24gY29udHJpYnV0aW9ucyBieSBTdGV2ZSBDbGVhcnksIEJlbWFuIERhd2VzLCBIb3dhcmQgSGlubmFudCBhbmQKK0pvaG4gTWFkZG9jay4KKworTWFpbnRhaW5lZCBieSBbQG1haWx0bzpqb2huQGpvaG5tYWRkb2NrLmNvLnVrIEpvaG4gTWFkZG9ja10uCisKK1tlbmRzZWN0XQpkaWZmIC0tZ2l0IGEvZG9jL2RlY2x2YWwucWJrIGIvZG9jL2RlY2x2YWwucWJrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGFhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZGVjbHZhbC5xYmsKQEAgLTAsMCArMSwxMTQgQEAKK1svCisgLyBDb3B5cmlnaHQgKGMpIDIwMDggSG93YXJkIEhpbm5hbnQKKyAvIENvcHlyaWdodCAoYykgMjAwOS0yMDAxMiBWaWNlbnRlIEouIEJvdGV0IEVzY3JpYmEKKyAvCisgLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisgLyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyAvXQorCitbYXJ0aWNsZSBEZWNsdmFsCisgICAgW3F1aWNrYm9vayAxLjVdCisgICAgW2F1dGhvcnMgW0hpbm5hbnQsIEhvd2FyZF1dCisgICAgW2F1dGhvcnMgW0JvdGV0IEVzY3JpYmEsIFZpY2VudGUgSi5dXQorICAgIFtjb3B5cmlnaHQgMjAwOCBIb3dhcmQgSGlubmFudF0KKyAgICBbY29weXJpZ2h0IDIwMDktMjAxMiBWaWNlbnRlIEouIEJvdGV0IEVzY3JpYmFdCisgICAgW2xpY2Vuc2UKKyAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICAgICAgICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgICAgICAgIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0XSkKKyAgICBdCitdCisKK1svPT09PT09PT09PT09PT09XQorW3NlY3Rpb24gT3ZlcnZpZXddCitbLz09PT09PT09PT09PT09PV0KKworVGhlIG1vdGl2YXRpb24gZm9yIGBkZWNsdmFsYCB3YXMgaW50cm9kdWNlZCBpbiBbQGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMDkvbjI5NTguaHRtbCNWYWx1ZSBOMjk1ODogCitNb3ZpbmcgU3dhcCBGb3J3YXJkXS4gSGVyZSBmb2xsb3dzIGEgcmV3b3JkaW5nIG9mIHRoaXMgY2hhcHRlci4KKworV2l0aCB0aGUgcHJvdmlzaW9uIG9mIGRlY2x0eXBlLCBsYXRlLXNwZWNpZmllZCByZXR1cm4gdHlwZXMsIGFuZCBkZWZhdWx0IHRlbXBsYXRlLWFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gdGVtcGxhdGVzIGEgCituZXcgZ2VuZXJhdGlvbiBvZiBTRklOQUUgcGF0dGVybnMgd2lsbCBlbWVyZ2UgdG8gYXQgbGVhc3QgcGFydGlhbGx5IGNvbXBlbnNhdGUgdGhlIGxhY2sgb2YgY29uY2VwdHMgb24gdGhlIEMrKzB4IHRpbWVzY2FsZS4gCitVc2luZyB0aGlzIHRlY2huaXF1ZSwgaXQgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBvYnRhaW4gYW4gb2JqZWN0IG9mIGEga25vd24gdHlwZSBpbiBhIG5vbi11c2luZyBjb250ZXh0LCBlLmcuIGdpdmVuIHRoZSBkZWNsYXJhdGlvbiAKKworICB0ZW1wbGF0ZTxjbGFzcyBUPgorICBUJiYgZGVjbHZhbCgpOyAvLyBub3QgdXNlZAorICAKK2FzIHBhcnQgb2YgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIGRlY2xhcmF0aW9uIAorCisgIHRlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPgorICBkZWNsdHlwZShzdGF0aWNfY2FzdDxUbz4oZGVjbHZhbDxGcm9tPigpKSkgY29udmVydChGcm9tJiYpOworICAKK29yIGFzIHBhcnQgb2YgYSBjbGFzcyB0ZW1wbGF0ZSBkZWZpbml0aW9uIAorCisgIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyByZXN1bHRfb2Y7CisKKyAgdGVtcGxhdGU8Y2xhc3MgRm4sIGNsYXNzLi4uIEFyZ1R5cGVzPgorICBzdHJ1Y3QgcmVzdWx0X29mPEZuKEFyZ1R5cGVzLi4uKT4gCisgIHsKKyAgICB0eXBlZGVmIGRlY2x0eXBlKGRlY2x2YWw8Rm4+KCkoZGVjbHZhbDxBcmdUeXBlcz4oKS4uLikpIHR5cGU7CisgIH07CisgIAorVGhlIHJvbGUgb2YgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIGRlY2x2YWwoKSBpcyBhIHRyYW5zZm9ybWF0aW9uIG9mIGEgdHlwZSBUIGludG8gYSB2YWx1ZSB3aXRob3V0IHVzaW5nIG9yIGV2YWx1YXRpbmcgdGhpcyBmdW5jdGlvbi4gCitUaGUgbmFtZSBpcyBzdXBwb3NlZCB0byBkaXJlY3QgdGhlIHJlYWRlcidzIGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0IHRoZSBleHByZXNzaW9uIGBkZWNsdmFsPFQ+KClgIGlzIGFuIGx2YWx1ZSBpZiBhbmQgb25seSBpZiAKK1QgaXMgYW4gbHZhbHVlLXJlZmVyZW5jZSwgb3RoZXJ3aXNlIGFuIHJ2YWx1ZS4gVG8gZXh0ZW5kIHRoZSBkb21haW4gb2YgdGhpcyBmdW5jdGlvbiB3ZSBjYW4gZG8gYSBiaXQgYmV0dGVyIGJ5IGNoYW5naW5nIGl0cyBkZWNsYXJhdGlvbiB0byAKKworICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB0eXBlbmFtZSBzdGQ6OmFkZF9ydmFsdWVfcmVmZXJlbmNlPFQ+Ojp0eXBlIGRlY2x2YWwoKTsgLy8gbm90IHVzZWQKKyAgCit3aGljaCBlbnN1cmVzIHRoYXQgd2UgY2FuIGFsc28gdXNlIGN2IHZvaWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVyLiBUaGUgY2FyZWZ1bCByZWFkZXIgbWlnaHQgaGF2ZSBub3RpY2VkIHRoYXQgYGRlY2x2YWwoKWAgCithbHJlYWR5IGV4aXN0cyB1bmRlciB0aGUgbmFtZSBjcmVhdGUoKSBhcyBwYXJ0IG9mIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHR5cGUgdHJhaXQgaXNfY29udmVydGlibGUgaW4gdGhlIEMrKzB4IHN0YW5kYXJkLiAKKworVGhlIHByb3Zpc2lvbiBvZiBhIG5ldyBsaWJyYXJ5IGNvbXBvbmVudCB0aGF0IGFsbG93cyB0aGUgcHJvZHVjdGlvbiBvZiB2YWx1ZXMgaW4gdW5ldmFsdWF0ZWQgZXhwcmVzc2lvbnMgaXMgY29uc2lkZXJlZCAKK2ltcG9ydGFudCB0byByZWFsaXplIGNvbnN0cmFpbmVkIHRlbXBsYXRlcyBpbiBDKysweCB3aGVyZSBjb25jZXB0cyBhcmUgbm90IGF2YWlsYWJsZS4gCitUaGlzIGV4dHJlbWVseSBsaWdodC13ZWlnaHQgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgcGFydCBvZiB0aGUgZGFpbHkgdG9vbC1ib3ggb2YgdGhlIEMrKzB4IHByb2dyYW1tZXIuIAorCitbZW5kc2VjdF0KKworCitbLz09PT09PT09PT09PT09PT09XQorW3NlY3Rpb246cmVmZXJlbmNlIFJlZmVyZW5jZSBdCitbLz09PT09PT09PT09PT09PT09XQorCitgI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZGVjbHZhbC5ocHA+YAorCisgICAgbmFtZXNwYWNlIGJvb3N0IHsKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGUgZGVjbHZhbCgpIG5vZXhjZXB0OyAvLyBhcyB1bmV2YWx1YXRlZCBvcGVyYW5kCisKKyAgICB9ICAvLyBuYW1lc3BhY2UgYm9vc3QKKworCitUaGUgbGlicmFyeSBwcm92aWRlcyB0aGUgZnVuY3Rpb24gdGVtcGxhdGUgZGVjbHZhbCB0byBzaW1wbGlmeSB0aGUgZGVmaW5pdGlvbiBvZiBleHByZXNzaW9ucyB3aGljaCBvY2N1ciBhcyB1bmV2YWx1YXRlZCBvcGVyYW5kcy4KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdHlwZW5hbWUgYWRkX3J2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGUgZGVjbHZhbCgpOworCitbKlJlbWFya3M6XSBJZiB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQsIHRoZSBwcm9ncmFtIGlzIGlsbC1mb3JtZWQuCisKK1sqUmVtYXJrczpdIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBvZiBkZWNsdmFsIG1heSBiZSBhbiBpbmNvbXBsZXRlIHR5cGUuCisKK1sqRXhhbXBsZTpdCisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVG8sIGNsYXNzIEZyb20+CisgICAgZGVjbHR5cGUoc3RhdGljX2Nhc3Q8VG8+KGRlY2x2YWw8RnJvbT4oKSkpIGNvbnZlcnQoRnJvbSYmKTsKKworRGVjbGFyZXMgYSBmdW5jdGlvbiB0ZW1wbGF0ZSBjb252ZXJ0IHdoaWNoIG9ubHkgcGFydGljaXBhdGVzIGluIG92ZXJsb2FkaW5nIGlmIHRoZSB0eXBlIEZyb20gY2FuIGJlIGV4cGxpY2l0bHkgY29udmVydGVkIHRvIHR5cGUgVG8uIAorCitbZW5kc2VjdF0KKworWy89PT09PT09PT09PT09PT1dCitbc2VjdGlvbiBIaXN0b3J5XQorWy89PT09PT09PT09PT09PT1dCisKK1toZWFkaW5nIGJvb3N0IDEuNTBdCisKK0ZpeGVzOgorCisqIFtAaHR0cDovL3N2bi5ib29zdC5vcmcvdHJhYy9ib29zdC90aWNrZXQvNjU3MCAjNjU3MF0gQWRkaW5nIG5vZXhjZXB0IHRvIGJvb3N0OjpkZWNsdmFsLgorCitbZW5kc2VjdF0KKworCisKKwpkaWZmIC0tZ2l0IGEvZG9jL3N0cmluZ19yZWYucWJrIGIvZG9jL3N0cmluZ19yZWYucWJrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNmZjNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3RyaW5nX3JlZi5xYmsKQEAgLTAsMCArMSwxNjcgQEAKK1svCisgLyBDb3B5cmlnaHQgKGMpIDIwMTIgTWFyc2hhbGwgQ2xvdworIC8KKyAvIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAvIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorIC9dCisKK1thcnRpY2xlIFN0cmluZ19SZWYKKyAgICBbcXVpY2tib29rIDEuNV0KKyAgICBbYXV0aG9ycyBbQ2xvdywgTWFyc2hhbGxdXQorICAgIFtjb3B5cmlnaHQgMjAxMiBNYXJzaGFsbCBDbG93XQorICAgIFtsaWNlbnNlCisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KKyAgICAgICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgICAgICBbQGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dF0pCisgICAgXQorXQorCitbLz09PT09PT09PT09PT09PV0KK1tzZWN0aW9uIE92ZXJ2aWV3XQorWy89PT09PT09PT09PT09PT1dCisKK0Jvb3N0LlN0cmluZ1JlZiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBKZWZmcmV5IFlhc2tpbidzIFtAaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMi9uMzQ0Mi5odG1sIE4zNDQyOgorc3RyaW5nX3JlZjogYSBub24tb3duaW5nIHJlZmVyZW5jZSB0byBhIHN0cmluZ10uIAorCitXaGVuIHlvdSBhcmUgcGFyc2luZy9wcm9jZXNzaW5nIHN0cmluZ3MgZnJvbSBzb21lIGV4dGVybmFsIHNvdXJjZSwgZnJlcXVlbnRseSB5b3Ugd2FudCB0byBwYXNzIGEgcGllY2Ugb2YgdGV4dCB0byBhIHByb2NlZHVyZSBmb3Igc3BlY2lhbGl6ZWQgcHJvY2Vzc2luZy4gVGhlIGNhbm9uaWNhbCB3YXkgdG8gZG8gdGhpcyBpcyBhcyBhIGBzdGQ6OnN0cmluZ2AsIGJ1dCB0aGF0IGhhcyBjZXJ0YWluIGRyYXdiYWNrczoKKworMSkgSWYgeW91IGFyZSBwcm9jZXNzaW5nIGEgYnVmZmVyIG9mIHRleHQgKHNheSBhIEhUVFAgcmVzcG9uc2Ugb3IgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSksIHRoZW4geW91IGhhdmUgdG8gY3JlYXRlIHRoZSBzdHJpbmcgZnJvbSB0aGUgdGV4dCB5b3Ugd2FudCB0byBwYXNzLCB3aGljaCBpbnZvbHZlcyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgY29weWluZyBvZiBkYXRhLgorCisyKSBpZiBhIHJvdXRpbmUgcmVjZWl2ZXMgYSBjb25zdGFudCBgc3RkOjpzdHJpbmdgIGFuZCB3YW50cyB0byBwYXNzIGEgcG9ydGlvbiBvZiB0aGF0IHN0cmluZyB0byBhbm90aGVyIHJvdXRpbmUsIHRoZW4gaXQgbXVzdCBjcmVhdGUgYSBuZXcgc3RyaW5nIG9mIHRoYXQgc3Vic3RyaW5nLgorCiszKSBBIHJvdXRpbmUgcmVjZWl2ZXMgYSBjb25zdGFudCBgc3RkOjpzdHJpbmdgIGFuZCB3YW50cyB0byByZXR1cm4gYSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcsIHRoZW4gaXQgbXVzdCBjcmVhdGUgYSBuZXcgc3RyaW5nIHRvIHJldHVybi4KKworYHN0cmluZ19yZWZgIGlzIGRlc2lnbmVkIHRvIHNvbHZlIHRoZXNlIGVmZmljaWVuY3kgcHJvYmxlbXMuIEEgYHN0cmluZ19yZWZgIGlzIGEgcmVhZC1vbmx5IHJlZmVyZW5jZSB0byBhIGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgYW5kIHByb3ZpZGVzIG11Y2ggb2YgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYHN0ZDo6c3RyaW5nYC4gQSBgc3RyaW5nX3JlZmAgaXMgY2hlYXAgdG8gY3JlYXRlLCBjb3B5IGFuZCBwYXNzIGJ5IHZhbHVlLCBiZWNhdXNlIGl0IGRvZXMgbm90IGFjdHVhbGx5IG93biB0aGUgc3RvcmFnZSB0aGF0IGl0IHBvaW50cyB0by4gCisKK0EgYHN0cmluZ19yZWZgIGlzIGltcGxlbWVudGVkIGFzIGEgc21hbGwgc3RydWN0IHRoYXQgY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgY2hhcmFjdGVyIGRhdGEgYW5kIGEgY291bnQuIEEgYHN0cmluZ19yZWZgIGlzIGNoZWFwIHRvIGNyZWF0ZSBhbmQgY2hlYXAgdG8gY29weS4KKworYHN0cmluZ19yZWZgIGFjdHMgYXMgYSBjb250YWluZXI7IGl0IGluY2x1ZGVzIGFsbCB0aGUgbWV0aG9kcyB0aGF0IHlvdSB3b3VsZCBleHBlY3QgaW4gYSBjb250YWluZXIsIGluY2x1ZGluZyBpdGVyYXRpb24gc3VwcG9ydCwgYG9wZXJhdG9yIFtdYCwgYGF0YCBhbmQgYHNpemVgLiBJdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBvZiB0aGUgaXRlcmF0b3ItYmFzZWQgYWxnb3JpdGhtcyBpbiB0aGUgU1RMIC0gYXMgbG9uZyBhcyB5b3UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZGF0YSAoYHNvcnRgIGFuZCBgcmVtb3ZlYCwgZm9yIGV4YW1wbGUsIHdpbGwgbm90IHdvcmspCisKK0Jlc2lkZXMgZ2VuZXJpYyBjb250YWluZXIgZnVuY3Rpb25hbGl0eSwgYHN0cmluZ19yZWZgIHByb3ZpZGVzIGEgc3Vic2V0IG9mIHRoZSBpbnRlcmZhY2Ugb2YgYHN0ZDo6c3RyaW5nYC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHJlcGxhY2UgcGFyYW1ldGVycyBvZiB0eXBlIGBjb25zdCBzdGQ6OnN0cmluZyAmYCB3aXRoIGBib29zdDo6c3RyaW5nX3JlZmAuIExpa2UgYHN0ZDo6c3RyaW5nYCwgYHN0cmluZ19yZWZgIGhhcyBhIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZWQgYG5wb3NgIHRvIGRlbm90ZSB0aGUgcmVzdWx0IG9mIGZhaWxlZCBzZWFyY2hlcywgYW5kIHRvIG1lYW4gInRoZSBlbmQiLgorCitCZWNhdXNlIGEgYHN0cmluZ19yZWZgIGRvZXMgbm90IG93biB0aGUgZGF0YSB0aGF0IGl0ICJwb2ludHMgdG8iLCBpdCBpbnRyb2R1Y2VzIGxpZmV0aW1lIGlzc3VlcyBpbnRvIGNvZGUgdGhhdCB1c2VzIGl0LiBUaGUgcHJvZ3JhbW1lciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBkYXRhIHRoYXQgYSBgc3RyaW5nX3JlZmAgcmVmZXJzIHRvIGV4aXN0cyBhcyBsb25nIGFzIHRoZSBgc3RyaW5nX3JlZmAgZG9lcy4KKworW2VuZHNlY3RdCisKKworWy89PT09PT09PT09PT09PT1dCitbc2VjdGlvbiBFeGFtcGxlc10KK1svPT09PT09PT09PT09PT09XQorCitJbnRlZ3JhdGluZyBgc3RyaW5nX3JlZmAgaW50byB5b3VyIGNvZGUgaXMgZmFpcmx5IHNpbXBsZS4gV2hlcmV2ZXIgeW91IHBhc3MgYSBgY29uc3Qgc3RkOjpzdHJpbmcgJmAgb3IgYHN0ZDo6c3RyaW5nYCBhcyBhIHBhcmFtZXRlciwgdGhhdCdzIGEgY2FuZGlkYXRlIGZvciBwYXNzaW5nIGEgYGJvb3N0OjpzdHJpbmdfcmVmYC4KKworICAgIHN0ZDo6c3RyaW5nIGV4dHJhY3RfcGFydCAoIGNvbnN0IHN0ZDo6c3RyaW5nICZiYXIgKSB7CisgICAgICAgIHJldHVybiBiYXIuc3Vic3RyICggMiwgMyApOworICAgICAgICB9CisgICAgICAgIAorICAgIGlmICggZXh0cmFjdF9wYXJ0ICggIkFCQ0RFRkciICkuZnJvbnQoKSA9PSAnQycgKSB7IC8qIGRvIHNvbWV0aGluZyAqLyB9CisgICAgCitMZXQncyBmaWd1cmUgb3V0IHdoYXQgaGFwcGVucyBpbiB0aGlzIChjb250cml2ZWQpIGV4YW1wbGUuCisKK0ZpcnN0LCBhIHRlbXBvcmFyeSBzdHJpbmcgaXMgY3JlYXRlZCBmcm9tIHRoZSBzdHJpbmcgbGl0ZXJhbCBgIkFCQ0RFRkciYCwgYW5kIGl0IGlzIHBhc3NlZCAoYnkgcmVmZXJlbmNlKSB0byB0aGUgcm91dGluZSBgZXh0cmFjdF9wYXJ0YC4gVGhlbiBhIHNlY29uZCBzdHJpbmcgaXMgY3JlYXRlZCBpbiB0aGUgY2FsbCBgc3RkOjpzdHJpbmc6OnN1YnN0cmAgYW5kIHJldHVybmVkIHRvIGBleHRyYWN0X3BhcnRgICh0aGlzIGNvcHkgbWF5IGJlIGVsaWRlZCBieSBSVk8pLiBUaGVuIGBleHRyYWN0X3BhcnRgIHJldHVybnMgdGhhdCBzdHJpbmcgYmFjayB0byB0aGUgY2FsbGVyIChhZ2FpbiB0aGlzIGNvcHkgbWF5IGJlIGVsaWRlZCkuIFRoZSBmaXJzdCB0ZW1wb3Jhcnkgc3RyaW5nIGlzIGRlYWxsb2NhdGVkLCBhbmQgYGZyb250YCBpcyBjYWxsZWQgb24gdGhlIHNlY29uZCBzdHJpbmcsIGFuZCB0aGVuIGl0IGlzIGRlYWxsb2NhdGVkIGFzIHdlbGwuCisKK1R3byBgc3RkOjpzdHJpbmdgcyBhcmUgY3JlYXRlZCwgYW5kIHR3byBjb3B5IG9wZXJhdGlvbnMuIFRoYXQncyAocG90ZW50aWFsbHkpIGZvdXIgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBkZWFsbG9jYXRpb25zLCBhbmQgdGhlIGFzc29jaWF0ZWQgY29weWluZyBvZiBkYXRhLgorCitOb3cgbGV0J3MgbG9vayBhdCB0aGUgc2FtZSBjb2RlIHdpdGggYHN0cmluZ19yZWZgOgorCisgICAgYm9vc3Q6OnN0cmluZ19yZWYgZXh0cmFjdF9wYXJ0ICggYm9vc3Q6OnN0cmluZ19yZWYgYmFyICkgeworICAgICAgICByZXR1cm4gYmFyLnN1YnN0ciAoIDIsIDMgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICBpZiAoIGV4dHJhY3RfcGFydCAoICJBQkNERUZHIiApLmZyb250KCkgPT0gIkMiICkgeyAvKiBkbyBzb21ldGhpbmcgKi8gfQorCitObyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vIGNvcHlpbmcgb2YgY2hhcmFjdGVyIGRhdGEuIE5vIGNoYW5nZXMgdG8gdGhlIGNvZGUgb3RoZXIgdGhhbiB0aGUgdHlwZXMuIFRoZXJlIGFyZSB0d28gYHN0cmluZ19yZWZgcyBjcmVhdGVkLCBhbmQgdHdvIGBzdHJpbmdfcmVmYHMgY29waWVkLCBidXQgdGhvc2UgYXJlIGNoZWFwIG9wZXJhdGlvbnMuCisKK1tlbmRzZWN0XQorCisKK1svPT09PT09PT09PT09PT09PT1dCitbc2VjdGlvbjpyZWZlcmVuY2UgUmVmZXJlbmNlIF0KK1svPT09PT09PT09PT09PT09PT1dCisKK1RoZSBoZWFkZXIgZmlsZSAic3RyaW5nX3JlZi5ocHAiIGRlZmluZXMgYSB0ZW1wbGF0ZSBgYm9vc3Q6OmJhc2ljX3N0cmluZ19yZWZgLCBhbmQgZm91ciBzcGVjaWFsaXphdGlvbnMgLSBmb3IgYGNoYXJgIC8gYHdjaGFyX3RgIC8gYGNoYXIxNl90YCAvIGBjaGFyMzJfdGAgLgorCitgI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHA+YAorCitDb25zdHJ1Y3Rpb24gYW5kIGNvcHlpbmc6CisKKyAgICBCT09TVF9DT05TVEVYUFIgYmFzaWNfc3RyaW5nX3JlZiAoKTsgICAgLy8gQ29uc3RydWN0cyBhbiBlbXB0eSBzdHJpbmdfcmVmCisgICAgQk9PU1RfQ09OU1RFWFBSIGJhc2ljX3N0cmluZ19yZWYoY29uc3QgY2hhclQqIHN0cik7IC8vIENvbnN0cnVjdHMgZnJvbSBhIE5VTEwtdGVybWluYXRlZCBzdHJpbmcKKyAgICBCT09TVF9DT05TVEVYUFIgYmFzaWNfc3RyaW5nX3JlZihjb25zdCBjaGFyVCogc3RyLCBzaXplX3R5cGUgbGVuKTsgLy8gQ29uc3RydWN0cyBmcm9tIGEgcG9pbnRlciwgbGVuZ3RoIHBhaXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgYmFzaWNfc3RyaW5nX3JlZihjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBzdHIpOyAvLyBDb25zdHJ1Y3RzIGZyb20gYSBzdGQ6OnN0cmluZworICAgIGJhc2ljX3N0cmluZ19yZWYgKGNvbnN0IGJhc2ljX3N0cmluZ19yZWYgJnJocyk7CisgICAgYmFzaWNfc3RyaW5nX3JlZiYgb3BlcmF0b3I9KGNvbnN0IGJhc2ljX3N0cmluZ19yZWYgJnJocyk7CisKK2BzdHJpbmdfcmVmYCBkb2VzIG5vdCBkZWZpbmUgYSBtb3ZlIGNvbnN0cnVjdG9yIG5vciBhIG1vdmUtYXNzaWdubWVudCBvcGVyYXRvciBiZWNhdXNlIGNvcHlpbmcgYSBgc3RyaW5nX3JlZmAgaXMganVzdCBhIGNoZWFwIGFzIG1vdmluZyBvbmUuCisKK0Jhc2ljIGNvbnRhaW5lci1saWtlIGZ1bmN0aW9uczoKKworICAgIEJPT1NUX0NPTlNURVhQUiBzaXplX3R5cGUgc2l6ZSgpICAgICBjb25zdCA7CisgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBsZW5ndGgoKSAgIGNvbnN0IDsKKyAgICBCT09TVF9DT05TVEVYUFIgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgOworICAgIEJPT1NUX0NPTlNURVhQUiBib29sIGVtcHR5KCkgICAgICAgICBjb25zdCA7CisgICAgCisgICAgLy8gQWxsIGl0ZXJhdG9ycyBhcmUgY29uc3RfaXRlcmF0b3JzCisgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0X2l0ZXJhdG9yICBiZWdpbigpIGNvbnN0IDsKKyAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgOworICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9pdGVyYXRvciAgICBlbmQoKSBjb25zdCA7CisgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0X2l0ZXJhdG9yICAgY2VuZCgpIGNvbnN0IDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgICAgICAgcmJlZ2luKCkgY29uc3QgOworICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgICAgIGNyYmVnaW4oKSBjb25zdCA7CisgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICAgcmVuZCgpIGNvbnN0IDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgICAgICAgIGNyZW5kKCkgY29uc3QgOworCitBY2Nlc3MgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudHMgKGFsbCBvZiB3aGljaCBhcmUgY29uc3QpOgorCisgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0IGNoYXJUJiBvcGVyYXRvcltdKHNpemVfdHlwZSBwb3MpIGNvbnN0IDsKKyAgICBjb25zdCBjaGFyVCYgYXQoc2l6ZV90IHBvcykgY29uc3QgOworICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdCBjaGFyVCYgZnJvbnQoKSBjb25zdCA7CisgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0IGNoYXJUJiBiYWNrKCkgIGNvbnN0IDsKKyAgICBCT09TVF9DT05TVEVYUFIgY29uc3QgY2hhclQqIGRhdGEoKSAgY29uc3QgOworCitNb2RpZnlpbmcgdGhlIGBzdHJpbmdfcmVmYCAoYnV0IG5vdCB0aGUgdW5kZXJseWluZyBkYXRhKToKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIHJlbW92ZV9wcmVmaXgoc2l6ZV90eXBlIG4pOworICAgIHZvaWQgcmVtb3ZlX3N1ZmZpeChzaXplX3R5cGUgbik7CisKK1NlYXJjaGluZzoKKworICAgIHNpemVfdHlwZSBmaW5kKGJhc2ljX3N0cmluZ19yZWYgcykgY29uc3QgOworICAgIHNpemVfdHlwZSBmaW5kKGNoYXJUIGMpIGNvbnN0IDsKKyAgICBzaXplX3R5cGUgcmZpbmQoYmFzaWNfc3RyaW5nX3JlZiBzKSBjb25zdCA7CisgICAgc2l6ZV90eXBlIHJmaW5kKGNoYXJUIGMpIGNvbnN0IDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjaGFyVCBjKSBjb25zdCA7CisgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZiAoY2hhclQgYykgY29uc3QgOworICAgICAgICAKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IDsKKyAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mKGJhc2ljX3N0cmluZ19yZWYgcykgY29uc3QgOworICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IDsKKyAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY2hhclQgYykgY29uc3QgOworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGJhc2ljX3N0cmluZ19yZWYgcykgY29uc3QgOworICAgIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNoYXJUIGMpIGNvbnN0IDsKKworU3RyaW5nLWxpa2Ugb3BlcmF0aW9uczoKKworICAgIEJPT1NUX0NPTlNURVhQUiBiYXNpY19zdHJpbmdfcmVmIHN1YnN0cihzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbj1ucG9zKSBjb25zdCA7IC8vIENyZWF0ZXMgYSBuZXcgc3RyaW5nX3JlZgorICAgIGJvb2wgc3RhcnRzX3dpdGgoY2hhclQgYykgY29uc3QgOworICAgIGJvb2wgc3RhcnRzX3dpdGgoYmFzaWNfc3RyaW5nX3JlZiB4KSBjb25zdCA7CisgICAgYm9vbCBlbmRzX3dpdGgoY2hhclQgYykgY29uc3QgOworICAgIGJvb2wgZW5kc193aXRoKGJhc2ljX3N0cmluZ19yZWYgeCkgY29uc3QgOworCitbZW5kc2VjdF0KKworWy89PT09PT09PT09PT09PT1dCitbc2VjdGlvbiBIaXN0b3J5XQorWy89PT09PT09PT09PT09PT1dCisKK1toZWFkaW5nIGJvb3N0IDEuNTNdCisqIEludHJvZHVjZWQKKyAgICAKKworW2VuZHNlY3RdCisKKworCisKZGlmZiAtLWdpdCBhL2VuYWJsZV9pZi5odG1sIGIvZW5hYmxlX2lmLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkMWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2VuYWJsZV9pZi5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9cmVmcmVzaCBjb250ZW50PSIwOyBVUkw9Li4vY29yZS9kb2MvaHRtbC9jb3JlL2VuYWJsZV9pZi5odG1sIj4KKzx0aXRsZT5BdXRvbWF0aWMgcmVkaXJlY3Rpb248L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitBdXRvbWF0aWMgcmVkaXJlY3Rpb24gZmFpbGVkLCBwbGVhc2UgZ28gdG8KKzxhIGhyZWY9Ii4uL2NvcmUvZG9jL2h0bWwvY29yZS9lbmFibGVfaWYuaHRtbCI+ZW5hYmxlX2lmLmh0bWw8L2E+LiZuYnNwOzxocj4KKzxwPqkgQ29weXJpZ2h0IEJlbWFuIERhd2VzLCAyMDAxPC9wPgorPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyAKK2ZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij5MSUNFTlNFXzFfMC50eHQ8L2E+IG9yIGNvcHkgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPnd3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9pZGVudGl0eV90eXBlL2RvYy9KYW1maWxlLnYyIGIvaWRlbnRpdHlfdHlwZS9kb2MvSmFtZmlsZS52MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NhMjllCi0tLSAvZGV2L251bGwKKysrIGIvaWRlbnRpdHlfdHlwZS9kb2MvSmFtZmlsZS52MgpAQCAtMCwwICsxLDQ0IEBACisKKyMgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTIgTG9yZW56byBDYW1pbml0aQorIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKKyMgKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisjIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKyMgSG9tZSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvaWRlbnRpdHlfdHlwZQorCitpbXBvcnQgcXVpY2tib29rIDsKK3VzaW5nIGJvb3N0Ym9vayA7CisKK2RveHlnZW4gcmVmZXJlbmNlIDogLi4vLi4vLi4vLi4vYm9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcAorICAgIDogICA8cmVmdGl0bGU+IlJlZmVyZW5jZSIKKyAgICAgICAgPGRveHlnZW46cGFyYW0+UFJFREVGSU5FRD0iRE9YWUdFTiIKKyAgICAgICAgPGRveHlnZW46cGFyYW0+UVVJRVQ9WUVTCisgICAgICAgIDxkb3h5Z2VuOnBhcmFtPldBUk5fSUZfVU5ET0NVTUVOVEVEPU5PCisgICAgICAgIDxkb3h5Z2VuOnBhcmFtPkhJREVfVU5ET0NfTUVNQkVSUz1ZRVMKKyAgICAgICAgPGRveHlnZW46cGFyYW0+SElERV9VTkRPQ19DTEFTU0VTPVlFUworICAgICAgICA8ZG94eWdlbjpwYXJhbT5BTElBU0VTPSIgUGFyYW1zPVwiPGI+UGFyYW1ldGVyczo8L2I+IDx0YWJsZSBib3JkZXI9IjAiPlwiIFBhcmFtezJ9PVwiPHRyPjx0ZD48Yj48dHQ+XFwxPC90dD48L2I+PC90ZD48dGQ+XFwyPC90ZD48L3RyPlwiIEVuZFBhcmFtcz1cIjwvdGFibGU+XCIgUmV0dXJucz1cIjxiPlJldHVybnM6PC9iPlwiIE5vdGU9XCI8Yj5Ob3RlOjwvYj5cIiBXYXJuaW5nPVwiPGI+V2FybmluZzo8L2I+XCIgU2VlPVwiPGI+U2VlOjwvYj5cIiBSZWZTZWN0ezJ9PVwiXFx4bWxvbmx5PGxpbmsgbGlua2VuZD0nYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuXFwxJz5cXDI8L2xpbms+XFxlbmR4bWxvbmx5XCIgUmVmQ2xhc3N7MX09XCJcXHhtbG9ubHk8Y29tcHV0ZXJvdXRwdXQ+PGNsYXNzbmFtZSBhbHQ9J1xcMSc+XFwxPC9jbGFzc25hbWU+PC9jb21wdXRlcm91dHB1dD5cXGVuZHhtbG9ubHlcIiBSZWZGdW5jezF9PVwiXFx4bWxvbmx5PGNvbXB1dGVyb3V0cHV0PjxmdW5jdGlvbm5hbWUgYWx0PSdcXDEnPlxcMTwvZnVuY3Rpb25uYW1lPjwvY29tcHV0ZXJvdXRwdXQ+XFxlbmR4bWxvbmx5XCIgUmVmTWFjcm97MX09XCJcXHhtbG9ubHk8Y29tcHV0ZXJvdXRwdXQ+PG1hY3JvbmFtZSBhbHQ9J1xcMSc+XFwxPC9tYWNyb25hbWU+PC9jb21wdXRlcm91dHB1dD5cXGVuZHhtbG9ubHlcIiAiCisgICAgOworCisjIFRoaXMgdGFyZ2V0IG11c3QgYmUgY2FsbGVkICJpbmRleCIgc28gdG8gZ2VuZXJhdGUgImluZGV4Lmh0bWwiIGZpbGUuCit4bWwgaW5kZXggOiBpZGVudGl0eV90eXBlLnFiayA6IDxkZXBlbmRlbmN5PnJlZmVyZW5jZSA7CisKK2Jvb3N0Ym9vayBkb2MgOiBpbmRleAorICAgIDogICA8bG9jYXRpb24+aHRtbAorICAgICAgICA8Zm9ybWF0Pm9uZWh0bWwKKyAgICAgICAgPHhzbDpwYXJhbT50b2Muc2VjdGlvbi5kZXB0aD0wCisgICAgICAgIDx4c2w6cGFyYW0+aHRtbC5zdHlsZXNoZWV0PS4uLy4uLy4uLy4uLy4uL2RvYy9zcmMvYm9vc3Rib29rLmNzcworICAgICAgICA8eHNsOnBhcmFtPmJvb3N0LnJvb3Q9Li4vLi4vLi4vLi4vLi4KKyAgICA7CisKKyMKKyMgVGhpcyBpcyB2ZXJ5IGltcGVyZmVjdCAtIGl0IHJlc3VsdHMgaW4gYm90aCBodG1sIGFuZCBwZGYgZG9jcyBiZWluZyBidWlsdCwKKyMgZm9yIHNvbWUgcmVhc29uIEkgY2FuJ3QgZ2V0IHRoZSAib25laHRtbCIgZm9ybWF0IHNwZWNpZmllZCBhYm92ZSB0byBwbGF5IG5pY2UKKyMgd2l0aCB0aGUgdXN1YWwgaW5jYW50YXRpb25zIGZvciBtaXhlZCBwZGYvaHRtbCBidWlsZHMuIEpNIDA2LzIwMTIuCisjCitib29zdGJvb2sgcGRmX2RvYyA6IGluZGV4CisgICAgOgorICAgICAgIDxmb3JtYXQ+cGRmCisgICAgICAgPGZvcm1hdD5odG1sOjxidWlsZD5ubworICAgIDsKKworaW5zdGFsbCBwZGZfZG9jX2luc3RhbGwgOiBwZGZfZG9jIDogPGxvY2F0aW9uPi4gPG5hbWU+aWRlbnRpdHlfdHlwZS5wZGYgPGluc3RhbGwtdHlwZT5QREYgOworZXhwbGljaXQgcGRmX2RvY19pbnN0YWxsIDsKZGlmZiAtLWdpdCBhL2lkZW50aXR5X3R5cGUvZG9jL2h0bWwvaW5kZXguaHRtbCBiL2lkZW50aXR5X3R5cGUvZG9jL2h0bWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzg2OWRiCi0tLSAvZGV2L251bGwKKysrIGIvaWRlbnRpdHlfdHlwZS9kb2MvaHRtbC9pbmRleC5odG1sCkBAIC0wLDAgKzEsMjUyIEBACis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+PHRpdGxlPkJvb3N0LlV0aWxpdHkvSWRlbnRpdHlUeXBlIDEuMC4wPC90aXRsZT48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi8uLi8uLi8uLi9kb2Mvc3JjL2Jvb3N0Ym9vay5jc3MiPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNzYuMSI+PC9oZWFkPjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj48ZGl2IGNsYXNzPSJjaGFwdGVyIiB0aXRsZT0iQm9vc3QuVXRpbGl0eS9JZGVudGl0eVR5cGUgMS4wLjAiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImJvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlIj48L2E+Qm9vc3QuVXRpbGl0eS9JZGVudGl0eVR5cGUgMS4wLjA8L2gyPjwvZGl2PjxkaXY+PGRpdiBjbGFzcz0iYXV0aG9yIj48aDMgY2xhc3M9ImF1dGhvciI+PHNwYW4gY2xhc3M9ImZpcnN0bmFtZSI+TG9yZW56bzwvc3Bhbj4gPHNwYW4gY2xhc3M9InN1cm5hbWUiPkNhbWluaXRpIDxjb2RlIGNsYXNzPSJlbWFpbCI+Jmx0OzxhIGNsYXNzPSJlbWFpbCIgaHJlZj0ibWFpbHRvOmxvcmNhbWluaXRpQGdtYWlsLmNvbSI+bG9yY2FtaW5pdGlAZ21haWwuY29tPC9hPiZndDs8L2NvZGU+PC9zcGFuPjwvaDM+PC9kaXY+PC9kaXY+PGRpdj48cCBjbGFzcz0iY29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAwOS0yMDEyIExvcmVuem8KKyAgICAgIENhbWluaXRpPC9wPjwvZGl2PjxkaXY+PGRpdiBjbGFzcz0ibGVnYWxub3RpY2UiIHRpdGxlPSJMZWdhbCBOb3RpY2UiPjxhIG5hbWU9ImJvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLmxlZ2FsIj48L2E+PHA+CisgICAgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMCAoc2VlIGFjY29tcGFueWluZworICAgICAgICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBhIGNvcHkgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0IiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pCisgICAgICA8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idG9jIj48cD48Yj5UYWJsZSBvZiBDb250ZW50czwvYj48L3A+PGRsPjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLm1vdGl2YXRpb24iPk1vdGl2YXRpb248L2E+PC9zcGFuPjwvZHQ+PGR0PjxzcGFuIGNsYXNzPSJzZWN0aW9uIj48YSBocmVmPSIjYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuc29sdXRpb24iPlNvbHV0aW9uPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLnRlbXBsYXRlcyI+VGVtcGxhdGVzPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLmFic3RyYWN0X3R5cGVzIj5BYnN0cmFjdCBUeXBlczwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IiNib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hbm5leF9fdXNhZ2UiPkFubmV4OiBVc2FnZTwvYT48L3NwYW4+PC9kdD48ZHQ+PHNwYW4gY2xhc3M9InNlY3Rpb24iPjxhIGhyZWY9IiNib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hbm5leF9faW1wbGVtZW50YXRpb24iPkFubmV4OgorICAgIEltcGxlbWVudGF0aW9uPC9hPjwvc3Bhbj48L2R0PjxkdD48c3BhbiBjbGFzcz0ic2VjdGlvbiI+PGEgaHJlZj0iI3JlZmVyZW5jZSI+UmVmZXJlbmNlPC9hPjwvc3Bhbj48L2R0PjwvZGw+PC9kaXY+PHA+CisgICAgVGhpcyBsaWJyYXJ5IGFsbG93cyB0byB3cmFwIHR5cGVzIHdpdGhpbiByb3VuZCBwYXJlbnRoZXNpcyBzbyB0aGV5IGNhbiBhbHdheXMKKyAgICBiZSBwYXNzZWQgYXMgbWFjcm8gcGFyYW1ldGVycy4KKyAgPC9wPjxkaXYgY2xhc3M9InNlY3Rpb24gYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGVfbW90aXZhdGlvbiIgdGl0bGU9Ik1vdGl2YXRpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUubW90aXZhdGlvbiI+PC9hPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUubW90aXZhdGlvbiIgdGl0bGU9Ik1vdGl2YXRpb24iPk1vdGl2YXRpb248L2E+PC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWFjcm8gd2hpY2ggZGVjbGFyZXMgYSB2YXJpYWJsZSBuYW1lZCA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj52YXI8L3NwYW4+PC9jb2RlPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5uPC9lbT48L3NwYW4+PC9jb2RlPgorICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlIGNsYXNzPSJsaXRlcmFsIj48c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT50eXBlPC9lbT48L3NwYW4+PC9jb2RlPiAoc2VlIGFsc28KKyAgICAgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvdmFyX2Vycm9yLmNwcCIgdGFyZ2V0PSJfdG9wIj48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+dmFyX2Vycm9yLmNwcDwvY29kZT48L2E+KToKKyAgICA8L3A+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNkZWZpbmU8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5WQVI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnR5cGU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+dHlwZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnZhcjwvc3Bhbj4gPHNwYW4gY2xhc3M9ImVycm9yIj4jPC9zcGFuPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiMgbjwvc3Bhbj4KKworPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlZBUjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4xPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOzwvc3Bhbj4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBPSy48L3NwYW4+Cis8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VkFSPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5zdGQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5tYXA8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNoYXI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDssPC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4yPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOzwvc3Bhbj4gICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIEVycm9yLjwvc3Bhbj4KKzwvcHJlPjxwPgorICAgIDwvcD48cD4KKyAgICAgIFRoZSBmaXJzdCBtYWNybyBpbnZvY2F0aW9uIHdvcmtzIGNvcnJlY3RseSBkZWNsYXJpbmcgYSB2YXJpYWJsZSBuYW1lZCA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj52YXIxPC9zcGFuPjwvY29kZT4gb2YgdHlwZSA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PC9jb2RlPi4KKyAgICAgIEhvd2V2ZXIsIHRoZSBzZWNvbmQgbWFjcm8gaW52b2NhdGlvbiBmYWlscyBnZW5lcmF0aW5nIGEgcHJlcHJvY2Vzc29yIGVycm9yCisgICAgICBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj5lcnJvcjogbWFjcm8gIlZBUiIgcGFzc2VkIDMgYXJndW1lbnRzLCBidXQgdGFrZXMganVzdCAyCis8L3ByZT48cD4KKyAgICAgIFRoYXQgaXMgYmVjYXVzZSB0aGUgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWFwPC9zcGFuPjwvY29kZT4gdHlwZSBwYXNzZWQgYXMgdGhlIGZpcnN0IG1hY3JvIHBhcmFtZXRlcgorICAgICAgY29udGFpbnMgYSBjb21tYSA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPjwvY29kZT4gbm90IHdyYXBwZWQKKyAgICAgIGJ5IHJvdW5kIHBhcmVudGhlc2lzIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9InNwZWNpYWwiPigpPC9zcGFuPjwvY29kZT4uIFRoZSBwcmVwcm9jZXNzb3IKKyAgICAgIGludGVycHJldHMgdGhhdCB1bndyYXBwZWQgY29tbWEgYXMgYSBzZXBhcmF0aW9uIGJldHdlZW4gbWFjcm8gcGFyYW1ldGVycyBjb25jbHVkaW5nCisgICAgICB0aGF0IGEgdG90YWwgb2YgdGhyZWUgKGFuZCBub3QgdHdvKSBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIG1hY3JvIGluIHRoZQorICAgICAgZm9sbG93aW5nIG9yZGVyOgorICAgIDwvcD48ZGl2IGNsYXNzPSJvcmRlcmVkbGlzdCI+PG9sIGNsYXNzPSJvcmRlcmVkbGlzdCIgdHlwZT0iMSI+PGxpIGNsYXNzPSJsaXN0aXRlbSI+CisgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWFwPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PC9jb2RlPgorICAgICAgICA8L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorICAgICAgICAgIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmNoYXI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs8L3NwYW4+PC9jb2RlPgorICAgICAgICA8L2xpPjxsaSBjbGFzcz0ibGlzdGl0ZW0iPgorICAgICAgICAgIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9Im51bWJlciI+Mjwvc3Bhbj48L2NvZGU+CisgICAgICAgIDwvbGk+PC9vbD48L2Rpdj48cD4KKyAgICAgIE5vdGUgdGhhdCwgZGlmZmVyZW50bHkgZnJvbSB0aGUgY29tcGlsZXIsIHRoZSBwcmVwcm9jZXNzb3Igb25seSByZWNvZ25pemVzCisgICAgICByb3VuZCBwYXJlbnRoZXNpcyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oKTwvc3Bhbj48L2NvZGU+LiBBbmd1bGFyCisgICAgICA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7Jmd0Ozwvc3Bhbj48L2NvZGU+IGFuZCBzcXVhcmVkIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9InNwZWNpYWwiPltdPC9zcGFuPjwvY29kZT4gcGFyZW50aGVzaXMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IKKyAgICAgIHdoZW4gcGFyc2luZyBtYWNybyBwYXJhbWV0ZXJzLgorICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIGJvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlX3NvbHV0aW9uIiB0aXRsZT0iU29sdXRpb24iPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuc29sdXRpb24iPjwvYT48YSBjbGFzcz0ibGluayIgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLnNvbHV0aW9uIiB0aXRsZT0iU29sdXRpb24iPlNvbHV0aW9uPC9hPjwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBJbiBzb21lIGNhc2VzLCBpdCBtaWdodCBiZSBwb3NzaWJsZSB0byB3b3JrYXJvdW5kIHRoaXMgaXNzdWUgYnkgYXZvaWRpbmcgdG8KKyAgICAgIHBhc3MgdGhlIHR5cGUgZXhwcmVzc2lvbiB0byB0aGUgbWFjcm8gYWxsIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2UKKyAgICAgIGFib3ZlIGEgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0ia2V5d29yZCI+dHlwZWRlZjwvc3Bhbj48L2NvZGU+IGNvdWxkIGhhdmUgYmVlbgorICAgICAgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIGV4cHJlc3Npb24gd2l0aCB0aGUgY29tbWFzIG91dHNpZGUgdGhlIG1hY3JvIChzZWUKKyAgICAgIGFsc28gPGEgaHJlZj0iLi4vLi4vdGVzdC92YXIuY3BwIiB0YXJnZXQ9Il90b3AiPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj52YXIuY3BwPC9jb2RlPjwvYT4pOgorICAgIDwvcD48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnR5cGVkZWY8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5zdGQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5tYXA8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNoYXI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5tYXBfdHlwZTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ozwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5WQVI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcF90eXBlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4zPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIE9LLjwvc3Bhbj4KKzwvcHJlPjxwPgorICAgIDwvcD48cD4KKyAgICAgIFdoZW4gdGhpcyBpcyBuZWl0aGVyIHBvc3NpYmxlIG5vciBkZXNpcmVkIChlLmcuLCBzZWUgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlCisgICAgICA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5mPC9zcGFuPjwvY29kZT4gaW4gdGhlIHNlY3Rpb24gYmVsb3cpLCB0aGlzCisgICAgICBsaWJyYXJ5IGhlYWRlciA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjaGVhZGVyLmJvb3N0LnV0aWxpdHkuaWRlbnRpdHlfdHlwZV9ocHAiIHRpdGxlPSJIZWFkZXIgJmx0O2Jvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHAmZ3Q7Ij5ib29zdC91dGlsaXR5L2lkZW50aXR5X3R5cGUuaHBwPC9hPjwvY29kZT4KKyAgICAgIGRlZmluZXMgYSBtYWNybyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPgorICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gd29ya2Fyb3VuZCB0aGUgaXNzdWUgd2hpbGUga2VlcGluZyB0aGUgdHlwZSBleHByZXNzaW9uCisgICAgICBhcyBvbmUgb2YgdGhlIG1hY3JvIHBhcmFtZXRlcnMgKHNlZSBhbHNvIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvdmFyLmNwcCIgdGFyZ2V0PSJfdG9wIj48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+dmFyLmNwcDwvY29kZT48L2E+KS4KKyAgICA8L3A+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNpbmNsdWRlPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Ym9vc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPi88L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnV0aWxpdHk8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPi88L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmlkZW50aXR5X3R5cGU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPi48L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmhwcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4KKworPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlZBUjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0OykpLDwvc3Bhbj4gPHNwYW4gY2xhc3M9Im51bWJlciI+NDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTs8L3NwYW4+IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBPSy48L3NwYW4+Cis8L3ByZT48cD4KKyAgICA8L3A+PHA+CisgICAgICBUaGUgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48YSBjbGFzcz0ibGluayIgaHJlZj0iI0JPT1NUX0lERU5USVRZX1RZUEUiIHRpdGxlPSJNYWNybyBCT09TVF9JREVOVElUWV9UWVBFIj5CT09TVF9JREVOVElUWV9UWVBFPC9hPjwvY29kZT4gbWFjcm8KKyAgICAgIGV4cGFuZHMgdG8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyAoYXQgY29tcGlsZS10aW1lKSB0byB0aGUgc3BlY2lmaWVkCisgICAgICB0eXBlLiBUaGUgc3BlY2lmaWVkIHR5cGUgaXMgbmV2ZXIgc3BsaXQgaW50byBtdWx0aXBsZSBtYWNybyBwYXJhbWV0ZXJzIGJlY2F1c2UKKyAgICAgIGl0IGlzIGFsd2F5cyB3cmFwcGVkIGJ5IGEgc2V0IG9mIGV4dHJhIHJvdW5kIHBhcmVudGhlc2lzIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9InNwZWNpYWwiPigpPC9zcGFuPjwvY29kZT4uCisgICAgICBJbiBmYWN0LCBhIHRvdGFsIG9mIHR3byBzZXRzIG9mIHJvdW5kIHBhcmVudGhlc2lzIG11c3QgYmUgdXNlZDogVGhlIHBhcmVudGhlc2lzCisgICAgICB0byBpbnZva2UgdGhlIG1hY3JvIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX0lERU5USVRZX1RZUEU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiguLi4pPC9zcGFuPjwvY29kZT4gcGx1cyB0aGUgaW5uZXIgcGFyZW50aGVzaXMgdG8gd3JhcCB0aGUKKyAgICAgIHR5cGUgcGFzc2VkIHRvIHRoZSBtYWNybyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9JREVOVElUWV9UWVBFPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oKC4uLikpPC9zcGFuPjwvY29kZT4uCisgICAgPC9wPjxwPgorICAgICAgVGhpcyBtYWNybyB3b3JrcyBvbiBhbnkgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvSlRDMS9TQzIyL1dHMjEvZG9jcy9zdGFuZGFyZHMiIHRhcmdldD0iX3RvcCI+QysrMDM8L2E+CisgICAgICBjb21waWxlciAoYW5kIGl0IGRvZXMgbm90IHVzZSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhZGljX21hY3JvIiB0YXJnZXQ9Il90b3AiPnZhcmlhZGljCisgICAgICBtYWNyb3M8L2E+KS4gPHN1cD5bPGEgbmFtZT0iYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuc29sdXRpb24uZjAiIGhyZWY9IiNmdG4uYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuc29sdXRpb24uZjAiIGNsYXNzPSJmb290bm90ZSI+MTwvYT5dPC9zdXA+IFRoZSBhdXRob3JzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgdGhpcyBsaWJyYXJ5IHVzaW5nCisgICAgICBHTlUgQ29tcGlsZXIgQ29sbGVjdGlvbiAoR0NDKSBDKysgNC41LjMgKHdpdGggYW5kIHdpdGhvdXQgQysrMTEgZmVhdHVyZXMgZW5hYmxlZAorICAgICAgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0ic3BlY2lhbCI+LTwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj49PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5jPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4rKzwvc3Bhbj48c3BhbiBjbGFzcz0ibnVtYmVyIj4wPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj54PC9zcGFuPjwvY29kZT4pIG9uIEN5Z3dpbgorICAgICAgYW5kIE1pc2Nyb3NvZnQgVmlzdWFsIEMrKyAoTVNWQykgOC4wIG9uIFdpbmRvd3MgNy4gU2VlIHRoZSBsaWJyYXJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL2RldmVsb3BtZW50L3Rlc3RzL3JlbGVhc2UvZGV2ZWxvcGVyL3V0aWxpdHktaWRlbnRpdHlfdHlwZS5odG1sIiB0YXJnZXQ9Il90b3AiPnJlZ3Jlc3Npb25zCisgICAgICB0ZXN0IHJlc3VsdHM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1cHBvcnRlZCBjb21waWxlcnMgYW5kIHBsYXRmb3Jtcy4KKyAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiBib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZV90ZW1wbGF0ZXMiIHRpdGxlPSJUZW1wbGF0ZXMiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUudGVtcGxhdGVzIj48L2E+PGEgY2xhc3M9ImxpbmsiIGhyZWY9IiNib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS50ZW1wbGF0ZXMiIHRpdGxlPSJUZW1wbGF0ZXMiPlRlbXBsYXRlczwvYT48L2gyPjwvZGl2PjwvZGl2PjwvZGl2PjxwPgorICAgICAgVGhpcyBtYWNybyBtdXN0IGJlIHByZWZpeGVkIGJ5IDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnR5cGVuYW1lPC9zcGFuPjwvY29kZT4KKyAgICAgIHdoZW4gdXNlZCB3aXRoaW4gdGVtcGxhdGVzLiBGb3IgZXhhbXBsZSwgbGV0J3MgcHJvZ3JhbSBhIG1hY3JvIHRoYXQgZGVjbGFyZXMKKyAgICAgIGEgZnVuY3Rpb24gcGFyYW1ldGVyIG5hbWVkIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFyZzwvc3Bhbj48L2NvZGU+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPm48L2VtPjwvc3Bhbj48L2NvZGU+CisgICAgICB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxzcGFuIGNsYXNzPSJlbXBoYXNpcyI+PGVtPnR5cGU8L2VtPjwvc3Bhbj48L2NvZGU+IChzZWUgYWxzbworICAgICAgPGEgaHJlZj0iLi4vLi4vdGVzdC90ZW1wbGF0ZS5jcHAiIHRhcmdldD0iX3RvcCI+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPnRlbXBsYXRlLmNwcDwvY29kZT48L2E+KToKKyAgICA8L3A+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNkZWZpbmU8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5BUkc8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnR5cGU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+dHlwZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFyZzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImVycm9yIj4jPC9zcGFuPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiMgbjwvc3Bhbj4KKworPHNwYW4gY2xhc3M9ImtleXdvcmQiPnRlbXBsYXRlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlbmFtZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs8L3NwYW4+Cis8c3BhbiBjbGFzcz0ia2V5d29yZCI+dm9pZDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmY8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBQcmVmaXggbWFjcm8gd2l0aCBgdHlwZW5hbWVgIGluIHRlbXBsYXRlcy48L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkFSRzwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+dHlwZW5hbWU8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9JREVOVElUWV9UWVBFPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oKDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWFwPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7KSksPC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4xPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPgorPHNwYW4gY2xhc3M9InNwZWNpYWwiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj57PC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5zdGQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5jb3V0PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0OyZsdDs8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5hcmcxPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj5bPC9zcGFuPjxzcGFuIGNsYXNzPSJudW1iZXIiPjA8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPl08L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7Jmx0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmVuZGw8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjs8L3NwYW4+Cis8c3BhbiBjbGFzcz0ic3BlY2lhbCI+fTwvc3Bhbj4KKzwvcHJlPjxwPgorICAgIDwvcD48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmE8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjs8L3NwYW4+Cis8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Wzwvc3Bhbj48c3BhbiBjbGFzcz0ibnVtYmVyIj4wPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj5dPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNoYXIiPidhJzwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ozwvc3Bhbj4KKworPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmY8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmNoYXI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDsoPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5hPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIE9LLi4uPC9zcGFuPgorPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIGYoYSk7ICAgIC8vIC4uLiBidXQgZXJyb3IuPC9zcGFuPgorPC9wcmU+PHA+CisgICAgPC9wPjxwPgorICAgICAgSG93ZXZlciwgbm90ZSB0aGF0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48L2NvZGU+CisgICAgICBtdXN0IGJlIG1hbnVhbGx5IHNwZWNpZmllZCB3aGVuIGludm9raW5nIHRoZSBmdW5jdGlvbiBhcyBpbiA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5mPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jaGFyPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTwvc3Bhbj48L2NvZGU+LiBJbiBmYWN0LAorICAgICAgd2hlbiB0aGUgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48YSBjbGFzcz0ibGluayIgaHJlZj0iI0JPT1NUX0lERU5USVRZX1RZUEUiIHRpdGxlPSJNYWNybyBCT09TVF9JREVOVElUWV9UWVBFIj5CT09TVF9JREVOVElUWV9UWVBFPC9hPjwvY29kZT4KKyAgICAgIG1hY3JvIGlzIHVzZWQgdG8gd3JhcCBhIGZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcgorICAgICAgY2FuIG5vIGxvbmdlciBiZSBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYnkgdGhlIGNvbXBpbGVyIGZvcm0gdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAgIGFzIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmY8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmE8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPik8L3NwYW4+PC9jb2RlPiB3b3VsZAorICAgICAgaGF2ZSBkb25lLiA8c3VwPls8YSBuYW1lPSJib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS50ZW1wbGF0ZXMuZjAiIGhyZWY9IiNmdG4uYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUudGVtcGxhdGVzLmYwIiBjbGFzcz0iZm9vdG5vdGUiPjI8L2E+XTwvc3VwPiAoVGhpcyBsaW1pdGF0aW9uIGRvZXMgbm90IGFwcGx5IHRvIGNsYXNzIHRlbXBsYXRlcyBiZWNhdXNlIGNsYXNzCisgICAgICB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIG11c3QgYWx3YXlzIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLikgSW4gb3RoZXIgd29yZHMsIHdpdGhvdXQKKyAgICAgIHVzaW5nIHRoZSA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPgorICAgICAgbWFjcm8sIEMrKyB3b3VsZCBub3JtYWxseSBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgZGVkdWNlIHRoZSBmdW5jdGlvbiB0ZW1wbGF0ZQorICAgICAgcGFyYW1ldGVyIGFzIHNob3duIGJlbG93OgorICAgIDwvcD48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnRlbXBsYXRlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlbmFtZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs8L3NwYW4+Cis8c3BhbiBjbGFzcz0ia2V5d29yZCI+dm9pZDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmc8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFyZzE8L3NwYW4+Cis8c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTwvc3Bhbj4gPHNwYW4gY2xhc3M9InNwZWNpYWwiPns8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmNvdXQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7Jmx0Ozwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFyZzE8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPls8L3NwYW4+PHNwYW4gY2xhc3M9Im51bWJlciI+MDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+XTwvc3Bhbj4gPHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDsmbHQ7PC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+ZW5kbDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ozwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJzcGVjaWFsIj59PC9zcGFuPgorPC9wcmU+PHA+CisgICAgPC9wPjxwPgorPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Zzwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Oyg8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmE8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPik7PC9zcGFuPiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gT0suLi48L3NwYW4+Cis8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Zzwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTs8L3NwYW4+ICAgICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyAuLi4gYW5kIGFsc28gT0suPC9zcGFuPgorPC9wcmU+PHA+CisgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24gYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGVfYWJzdHJhY3RfdHlwZXMiIHRpdGxlPSJBYnN0cmFjdCBUeXBlcyI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hYnN0cmFjdF90eXBlcyI+PC9hPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuYWJzdHJhY3RfdHlwZXMiIHRpdGxlPSJBYnN0cmFjdCBUeXBlcyI+QWJzdHJhY3QgVHlwZXM8L2E+PC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIE9uIHNvbWUgY29tcGlsZXJzIChlLmcuLCBHQ0MpLCB1c2luZyB0aGlzIG1hY3JvIG9uIGFic3RyYWN0IHR5cGVzIChpLmUuLCBjbGFzc2VzCisgICAgICB3aXRoIG9uZSBvciBtb3JlIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMpIGdlbmVyYXRlcyBhIGNvbXBpbGVyIGVycm9yLiBUaGlzIGNhbgorICAgICAgYmUgYXZvaWRlZCBieSBtYW5pcHVsYXRpbmcgdGhlIHR5cGUgYWRkaW5nIGFuZCByZW1vdmluZyBhIHJlZmVyZW5jZSB0byBpdC4KKyAgICA8L3A+PHA+CisgICAgICBMZXQncyBwcm9ncmFtIGEgbWFjcm8gdGhhdCBwZXJmb3JtcyBhIHN0YXRpYyBhc3NlcnRpb24gb24gYSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlbXBsYXRlX21ldGFwcm9ncmFtbWluZyIgdGFyZ2V0PSJfdG9wIj5UZW1wbGF0ZQorICAgICAgTWV0YS1Qcm9ncmFtbWluZzwvYT4gKFRNUCkgbWV0YS1mdW5jdGlvbiAoc2ltaWxhcmx5IHRvIEJvb3N0Lk1QTCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9kb2MvbGlicy8xXzM2XzAvbGlicy9tcGwvZG9jL3JlZm1hbnVhbC9hc3NlcnQuaHRtbCIgdGFyZ2V0PSJfdG9wIj48Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9NUExfQVNTRVJUPC9zcGFuPjwvY29kZT48L2E+KS4gVGhlIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PGEgY2xhc3M9ImxpbmsiIGhyZWY9IiNCT09TVF9JREVOVElUWV9UWVBFIiB0aXRsZT0iTWFjcm8gQk9PU1RfSURFTlRJVFlfVFlQRSI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvYT48L2NvZGU+IG1hY3JvIGNhbiBiZSB1c2VkCisgICAgICB0byBwYXNzIGEgbWV0YS1mdW5jdGlvbiB3aXRoIG11bHRpcGxlIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gdGhlIGFzc2VydCBtYWNybworICAgICAgKHNvIHRvIGhhbmRsZSB0aGUgY29tbWFzIHNlcGFyYXRpbmcgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMpLiBJbiB0aGlzIGNhc2UsCisgICAgICBpZiB0aGUgbWV0YS1mdW5jdGlvbiBpcyBhbiBhYnN0cmFjdCB0eXBlLCBpdCBuZWVkcyB0byBiZSBtYW5pcHVsYXRlZCBhZGRpbmcKKyAgICAgIGFuZCByZW1vdmluZyBhIHJlZmVyZW5jZSB0byBpdCAoc2VlIGFsc28gPGEgaHJlZj0iLi4vLi4vdGVzdC9hYnN0cmFjdC5jcHAiIHRhcmdldD0iX3RvcCI+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPmFic3RyYWN0LmNwcDwvY29kZT48L2E+KToKKyAgICA8L3A+PHA+Cis8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPjxzcGFuIGNsYXNzPSJwcmVwcm9jZXNzb3IiPiNkZWZpbmU8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UTVBfQVNTRVJUPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5tZXRhZnVuY3Rpb248L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj5cPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9TVEFUSUNfQVNTRVJUPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5tZXRhZnVuY3Rpb248L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj52YWx1ZTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTwvc3Bhbj4KKworPHNwYW4gY2xhc3M9ImtleXdvcmQiPnRlbXBsYXRlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj50eXBlbmFtZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5ib29sPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Yjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJrZXl3b3JkIj5zdHJ1Y3Q8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5hYnN0cmFjdDwvc3Bhbj4gPHNwYW4gY2xhc3M9InNwZWNpYWwiPns8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnN0YXRpYzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvbnN0PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Ym9vbDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnZhbHVlPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+PTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjs8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPnZpcnR1YWw8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj52b2lkPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Zjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvbnN0PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mYW1wOzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPng8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPik8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj49PC9zcGFuPiA8c3BhbiBjbGFzcz0ibnVtYmVyIj4wPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj47PC9zcGFuPiAgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbi48L3NwYW4+Cis8c3BhbiBjbGFzcz0ic3BlY2lhbCI+fTs8L3NwYW4+CisKKzxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UTVBfQVNTRVJUPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5ib29zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnJlbW92ZV9yZWZlcmVuY2U8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+ICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIEFkZCBhbmQgcmVtb3ZlPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+ICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gcmVmZXJlbmNlIGZvcjwvc3Bhbj4KKyAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5ib29zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFkZF9yZWZlcmVuY2U8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+ICAgICAgIDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBhYnN0cmFjdCB0eXBlLjwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YWJzdHJhY3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPnRydWU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs8L3NwYW4+CisgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj50eXBlPC9zcGFuPgorICAgICAgICA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+KSk8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs6Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+dHlwZTwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOzwvc3Bhbj4KKzwvcHJlPjxwPgorICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIGJvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlX2FubmV4X191c2FnZSIgdGl0bGU9IkFubmV4OiBVc2FnZSI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hbm5leF9fdXNhZ2UiPjwvYT48YSBjbGFzcz0ibGluayIgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLmFubmV4X191c2FnZSIgdGl0bGU9IkFubmV4OiBVc2FnZSI+QW5uZXg6IFVzYWdlPC9hPjwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PHA+CisgICAgICBUaGUgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48YSBjbGFzcz0ibGluayIgaHJlZj0iI0JPT1NUX0lERU5USVRZX1RZUEUiIHRpdGxlPSJNYWNybyBCT09TVF9JREVOVElUWV9UWVBFIj5CT09TVF9JREVOVElUWV9UWVBFPC9hPjwvY29kZT4gbWFjcm8KKyAgICAgIGNhbiBiZSB1c2VkIGVpdGhlciB3aGVuIGNhbGxpbmcgYSB1c2VyLWRlZmluZWQgbWFjcm8gKGFzIHNob3duIGJ5IHRoZSBleGFtcGxlcworICAgICAgc28gZmFyKSwgb3IgaW50ZXJuYWxseSB3aGVuIGltcGxlbWVudGluZyBhIHVzZXItZGVmaW5lZCBtYWNybyAoYXMgc2hvd24gYmVsb3cpLgorICAgICAgV2hlbiA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPiBpcworICAgICAgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVzZXItZGVmaW5lZCBtYWNybywgdGhlIGNhbGxlciBvZiB0aGUgdXNlcgorICAgICAgbWFjcm8gd2lsbCBoYXZlIHRvIHNwZWNpZnkgdGhlIGV4dHJhIHBhcmVudGhlc2lzIChzZWUgYWxzbyA8YSBocmVmPSIuLi8uLi90ZXN0L3BhcmVuLmNwcCIgdGFyZ2V0PSJfdG9wIj48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+cGFyZW4uY3BwPC9jb2RlPjwvYT4pOgorICAgIDwvcD48cD4KKzwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+PHNwYW4gY2xhc3M9InByZXByb2Nlc3NvciI+I2RlZmluZTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPlRNUF9BU1NFUlRfUEFSRU48L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnBhcmVudGhlc2l6ZWRfbWV0YWZ1bmN0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+XDwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0iY29tbWVudCI+LyogdXNlIGBCT09TVF9JREVOVElUWV9UWVBFYCBpbiBtYWNybyBkZWZpbml0aW9uIGluc3RlYWQgb2YgaW52b2NhdGlvbiAqLzwvc3Bhbj4gPHNwYW4gY2xhc3M9InNwZWNpYWwiPlw8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX1NUQVRJQ19BU1NFUlQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX0lERU5USVRZX1RZUEU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnBhcmVudGhlc2l6ZWRfbWV0YWZ1bmN0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pOjo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnZhbHVlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPgorCis8c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4jZGVmaW5lPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VE1QX0FTU0VSVDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWV0YWZ1bmN0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+XDwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfU1RBVElDX0FTU0VSVDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWV0YWZ1bmN0aW9uPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+dmFsdWU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPik8L3NwYW4+CisKKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBTcGVjaWZ5IG9ubHkgZXh0cmEgcGFyZW50aGVzaXMgYCgoLi4uKSlgLjwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UTVBfQVNTRVJUX1BBUkVOPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oKDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Ym9vc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5pc19jb25zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWFwPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jaGFyPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y29uc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDspKTs8L3NwYW4+CisKKzxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBTcGVjaWZ5IGJvdGggdGhlIGV4dHJhIHBhcmVudGhlc2lzIGAoKC4uLikpYCBhbmQgYEJPT1NUX0lERU5USVRZX1RZUEVgIG1hY3JvLjwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UTVBfQVNTRVJUPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9JREVOVElUWV9UWVBFPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oKDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Ym9vc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5pc19jb25zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+c3RkPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bWFwPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jaGFyPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7PC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y29uc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDspKSk7PC9zcGFuPgorPC9wcmU+PHA+CisgICAgPC9wPjxwPgorICAgICAgSG93ZXZlciwgbm90ZSB0aGF0IHRoZSBjYWxsZXIgd2lsbCA8c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT5hbHdheXM8L2VtPjwvc3Bhbj4gaGF2ZSB0byBzcGVjaWZ5CisgICAgICB0aGUgZXh0cmEgcGFyZW50aGVzaXMgZXZlbiB3aGVuIHRoZSBtYWNybyBwYXJhbWV0ZXJzIGNvbnRhaW4gbm8gY29tbWE6CisgICAgPC9wPjxwPgorPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VE1QX0FTU0VSVF9QQVJFTjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmJvb3N0PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+aXNfY29uc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNvbnN0PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7KSk7PC9zcGFuPiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gQWx3YXlzIGV4dHJhIGAoKC4uLikpYC48L3NwYW4+CisKKzxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5UTVBfQVNTRVJUPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5ib29zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmlzX2NvbnN0PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5jb25zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Oyk7PC9zcGFuPiA8c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gTm8gZXh0cmEgYCgoLi4uKSlgIGFuZCBubyBtYWNyby48L3NwYW4+Cis8L3ByZT48cD4KKyAgICA8L3A+PHA+CisgICAgICBJbiBzb21lIGNhc2VzLCB1c2luZyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPgorICAgICAgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyLWRlZmluZWQgbWFjcm8gbWlnaHQgcHJvdmlkZSB0aGUgYmVzdCBzeW50YXgKKyAgICAgIGZvciB0aGUgY2FsbGVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyB0aGUgY2FzZSBmb3IgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfTVBMX0FTU0VSVDwvc3Bhbj48L2NvZGU+CisgICAgICBiZWNhdXNlIHRoZSBtYWpvcml0eSBvZiB0ZW1wbGF0ZSBtZXRhLXByb2dyYW1taW5nIGV4cHJlc3Npb25zIGNvbnRhaW4gdW53cmFwcGVkCisgICAgICBjb21tYXMgc28gaXQgaXMgbGVzcyBjb25mdXNpbmcgZm9yIHRoZSB1c2VyIHRvIGFsd2F5cyBzcGVjaWZ5IHRoZSBleHRyYSBwYXJlbnRoZXNpcworICAgICAgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCguLi4pKTwvc3Bhbj48L2NvZGU+IGluc3RlYWQgb2YgdXNpbmcgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48YSBjbGFzcz0ibGluayIgaHJlZj0iI0JPT1NUX0lERU5USVRZX1RZUEUiIHRpdGxlPSJNYWNybyBCT09TVF9JREVOVElUWV9UWVBFIj5CT09TVF9JREVOVElUWV9UWVBFPC9hPjwvY29kZT46CisgICAgPC9wPjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfTVBMX0FTU0VSVDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+IDxzcGFuIGNsYXNzPSJjb21tZW50Ij4vLyBOYXR1cmFsIHN5bnRheC48L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmJvb3N0PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+bXBsPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj46Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YW5kXzwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj4KKyAgICAgICAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Ym9vc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5pc19jb25zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4KKyAgICAgICAgPHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5ib29zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmlzX3JlZmVyZW5jZTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+VDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Ozwvc3Bhbj4KKzxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pKTs8L3NwYW4+Cis8L3ByZT48cD4KKyAgICAgIEhvd2V2ZXIsIGluIG90aGVyIHNpdHVhdGlvbnMgaXQgbWlnaHQgYmUgcHJlZmVyYWJsZSB0byBub3QgcmVxdWlyZSB0aGUgZXh0cmEKKyAgICAgIHBhcmVudGhlc2lzIGluIHRoZSBjb21tb24gY2FzZXMgYW5kIGhhbmRsZSBjb21tYXMgYXMgc3BlY2lhbCBjYXNlcyB1c2luZyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPi4gRm9yIGV4YW1wbGUsIHRoaXMKKyAgICAgIGlzIHRoZSBjYXNlIGZvciA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL2xvY2FsX2Z1bmN0aW9uIiB0YXJnZXQ9Il90b3AiPjxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX0xPQ0FMX0ZVTkNUSU9OPC9zcGFuPjwvY29kZT48L2E+IGZvciB3aGljaCBhbHdheXMKKyAgICAgIHJlcXVpcmluZyB0aGUgZXh0cmEgcGFyZW50aGVzaXMgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCguLi4pKTwvc3Bhbj48L2NvZGU+CisgICAgICBhcm91bmQgdGhlIHR5cGVzIHdvdWxkIGxlYWQgdG8gYW4gdW5uYXR1cmFsIHN5bnRheCBmb3IgdGhlIGxvY2FsIGZ1bmN0aW9uIHNpZ25hdHVyZToKKyAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9MT0NBTF9GVU5DVElPTjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj4gPHNwYW4gY2xhc3M9InNwZWNpYWwiPigoPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZhbXA7KSk8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj54PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+JmFtcDspKTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnk8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+ezwvc3Bhbj4gPHNwYW4gY2xhc3M9ImNvbW1lbnQiPi8vIFVubmF0dXJhbCBzeW50YXguPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5yZXR1cm48L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj54PC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+Kzwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnk8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjs8L3NwYW4+Cis8c3BhbiBjbGFzcz0ic3BlY2lhbCI+fTwvc3Bhbj4gPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX0xPQ0FMX0ZVTkNUSU9OX05BTUU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmFkZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTwvc3Bhbj4KKzwvcHJlPjxwPgorICAgICAgSW5zdGVhZCByZXF1aXJpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+PC9jb2RlPgorICAgICAgb25seSB3aGVuIG5lZWRlZCBhbGxvd3MgZm9yIHRoZSBtb3JlIG5hdHVyYWwgc3ludGF4IDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPkJPT1NUX0xPQ0FMX0ZVTkNUSU9OPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZhbXA7PC9zcGFuPgorICAgICAgPHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPng8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiw8L3NwYW4+IDxzcGFuIGNsYXNzPSJrZXl3b3JkIj5pbnQ8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZhbXA7PC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+eTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KTwvc3Bhbj48L2NvZGU+IGluIHRoZSBjb21tb24gY2FzZXMgd2hlbiB0aGUgcGFyYW1ldGVyIHR5cGVzCisgICAgICBjb250YWluIG5vIGNvbW1hICh3aGlsZSBzdGlsbCBhbGxvd2luZyB0byBzcGVjaWZ5IHBhcmFtZXRlciB0eXBlcyB3aXRoIGNvbW1hcworICAgICAgYXMgc3BlY2lhbCBjYXNlcyB1c2luZyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9MT0NBTF9GVU5DVElPTjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0OykpJmFtcDs8L3NwYW4+CisgICAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+eDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+LDwvc3Bhbj4gPHNwYW4gY2xhc3M9ImtleXdvcmQiPmludDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+JmFtcDs8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj55PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPjwvY29kZT4pLgorICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIGJvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlX2FubmV4X19pbXBsZW1lbnRhdGlvbiIgdGl0bGU9IkFubmV4OiBJbXBsZW1lbnRhdGlvbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSIgc3R5bGU9ImNsZWFyOiBib3RoIj48YSBuYW1lPSJib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hbm5leF9faW1wbGVtZW50YXRpb24iPjwvYT48YSBjbGFzcz0ibGluayIgaHJlZj0iI2Jvb3N0X3V0aWxpdHlfaWRlbnRpdHl0eXBlLmFubmV4X19pbXBsZW1lbnRhdGlvbiIgdGl0bGU9IkFubmV4OiBJbXBsZW1lbnRhdGlvbiI+QW5uZXg6CisgICAgSW1wbGVtZW50YXRpb248L2E+PC9oMj48L2Rpdj48L2Rpdj48L2Rpdj48cD4KKyAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgbWFjcm8gaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nOiA8c3VwPls8YSBuYW1lPSJib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5hbm5leF9faW1wbGVtZW50YXRpb24uZjAiIGhyZWY9IiNmdG4uYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuYW5uZXhfX2ltcGxlbWVudGF0aW9uLmYwIiBjbGFzcz0iZm9vdG5vdGUiPjM8L2E+XTwvc3VwPgorICAgIDwvcD48cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+PHNwYW4gY2xhc3M9InByZXByb2Nlc3NvciI+I2luY2x1ZGU8L3NwYW4+IDxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mbHQ7PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5ib29zdDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Lzwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+dHlwZV90cmFpdHM8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPi88L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPmZ1bmN0aW9uX3RyYWl0czwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ljwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+aHBwPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4mZ3Q7PC9zcGFuPgorCis8c3BhbiBjbGFzcz0icHJlcHJvY2Vzc29yIj4jZGVmaW5lPC9zcGFuPiA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KDwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+cGFyZW50aGVzaXplZF90eXBlPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPiA8c3BhbiBjbGFzcz0ic3BlY2lhbCI+XDwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Ym9vc3Q8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPjo6PC9zcGFuPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5mdW5jdGlvbl90cmFpdHM8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZsdDs8L3NwYW4+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnZvaWQ8L3NwYW4+IDxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5wYXJlbnRoZXNpemVkX3R5cGU8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDs6Ojwvc3Bhbj48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+YXJnMV90eXBlPC9zcGFuPgorPC9wcmU+PHA+CisgICAgICBFc3NlbnRpYWxseSwgdGhlIHR5cGUgaXMgd3JhcHBlZCBiZXR3ZWVuIHJvdW5kIHBhcmVudGhlc2lzIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPgorICAgICAgPHNwYW4gY2xhc3M9ImtleXdvcmQiPmNoYXI8L3NwYW4+PHNwYW4gY2xhc3M9InNwZWNpYWwiPiZndDspPC9zcGFuPjwvY29kZT4KKyAgICAgIHNvIGl0IGNhbiBiZSBwYXNzZWQgYXMgYSBzaW5nbGUgbWFjcm8gcGFyYW1ldGVyIGV2ZW4gaWYgaXQgY29udGFpbnMgY29tbWFzLgorICAgICAgVGhlbiB0aGUgcGFyZW50aGVzaXplZCB0eXBlIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiByZXR1cm5pbmcKKyAgICAgIDxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9ImtleXdvcmQiPnZvaWQ8L3NwYW4+PC9jb2RlPiBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUKKyAgICAgIGFzIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhbmQgb25seSBhcmd1bWVudCA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj52b2lkPC9zcGFuPgorICAgICAgPHNwYW4gY2xhc3M9InNwZWNpYWwiPig8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPnN0ZDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Ojo8L3NwYW4+PHNwYW4gY2xhc3M9ImlkZW50aWZpZXIiPm1hcDwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmx0Ozwvc3Bhbj48c3BhbiBjbGFzcz0ia2V5d29yZCI+aW50PC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4sPC9zcGFuPiA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Y2hhcjwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+Jmd0Oyk8L3NwYW4+PC9jb2RlPi4gRmluYWxseSwgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5hcmcxX3R5cGU8L3NwYW4+PC9jb2RlPiBpcyBleHRyYWN0ZWQgYXQgY29tcGlsZS10aW1lCisgICAgICB1c2luZyB0aGUgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+ZnVuY3Rpb25fdHJhaXRzPC9zcGFuPjwvY29kZT4gbWV0YS1mdW5jdGlvbgorICAgICAgdGhlcmVmb3JlIG9idGFpbmluZyB0aGUgb3JpZ2luYWwgdHlwZSBmcm9tIHRoZSBwYXJlbnRoZXNpemVkIHR5cGUgKGVmZmVjdGl2ZWx5CisgICAgICBzdHJpcHBpbmcgdGhlIGV4dHJhIHBhcmVudGhlc2lzIGZyb20gYXJvdW5kIHRoZSBzcGVjaWZpZWQgdHlwZSkuCisgICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24gcmVmZXJlbmNlIiB0aXRsZT0iUmVmZXJlbmNlIj48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDIgY2xhc3M9InRpdGxlIiBzdHlsZT0iY2xlYXI6IGJvdGgiPjxhIG5hbWU9InJlZmVyZW5jZSI+PC9hPlJlZmVyZW5jZTwvaDI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiBoZWFkZXJfYm9vc3RfdXRpbGl0eV9pZGVudGl0eV90eXBlX2hwcCIgdGl0bGU9IkhlYWRlciAmbHQ7Ym9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcCZndDsiPjxkaXYgY2xhc3M9InRpdGxlcGFnZSI+PGRpdj48ZGl2PjxoMyBjbGFzcz0idGl0bGUiPjxhIG5hbWU9ImhlYWRlci5ib29zdC51dGlsaXR5LmlkZW50aXR5X3R5cGVfaHBwIj48L2E+SGVhZGVyICZsdDs8YSBocmVmPSIuLi8uLi8uLi8uLi8uLi9ib29zdC91dGlsaXR5L2lkZW50aXR5X3R5cGUuaHBwIiB0YXJnZXQ9Il90b3AiPmJvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHA8L2E+Jmd0OzwvaDM+PC9kaXY+PC9kaXY+PC9kaXY+PHA+V3JhcCB0eXBlIGV4cHJlc3Npb25zIHdpdGggcm91bmQgcGFyZW50aGVzaXMgc28gdGhleSBjYW4gYmUgcGFzc2VkIHRvIG1hY3JvcyBldmVuIGlmIHRoZXkgY29udGFpbiBjb21tYXMuIDwvcD48cHJlIGNsYXNzPSJzeW5vcHNpcyI+CisKKzxhIGNsYXNzPSJsaW5rIiBocmVmPSIjQk9PU1RfSURFTlRJVFlfVFlQRSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPkJPT1NUX0lERU5USVRZX1RZUEU8L2E+KHBhcmVudGhlc2l6ZWRfdHlwZSk8L3ByZT48ZGl2IGNsYXNzPSJyZWZlbnRyeSIgdGl0bGU9Ik1hY3JvIEJPT1NUX0lERU5USVRZX1RZUEUiPjxhIG5hbWU9IkJPT1NUX0lERU5USVRZX1RZUEUiPjwvYT48ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjwvZGl2PjxkaXYgY2xhc3M9InJlZm5hbWVkaXYiPjxoMj48c3BhbiBjbGFzcz0icmVmZW50cnl0aXRsZSI+TWFjcm8gQk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48L2gyPjxwPkJPT1NUX0lERU5USVRZX1RZUEUg4oCUIFRoaXMgbWFjcm8gYWxsb3dzIHRvIHdyYXAgdGhlIHNwZWNpZmllZCB0eXBlIGV4cHJlc3Npb24gd2l0aGluIGV4dHJhIHJvdW5kIHBhcmVudGhlc2lzIHNvIHRoZSB0eXBlIGNhbiBiZSBwYXNzZWQgYXMgYSBzaW5nbGUgbWFjcm8gcGFyYW1ldGVyIGV2ZW4gaWYgaXQgY29udGFpbnMgY29tbWFzIChub3QgYWxyZWFkeSB3cmFwcGVkIHdpdGhpbiByb3VuZCBwYXJlbnRoZXNpcykuIDwvcD48L2Rpdj48aDIgY2xhc3M9InJlZnN5bm9wc2lzZGl2LXRpdGxlIj5TeW5vcHNpczwvaDI+PGRpdiBjbGFzcz0icmVmc3lub3BzaXNkaXYiPjxwcmUgY2xhc3M9InN5bm9wc2lzIj48c3BhbiBjbGFzcz0iY29tbWVudCI+Ly8gSW4gaGVhZGVyOiAmbHQ7PGEgY2xhc3M9ImxpbmsiIGhyZWY9IiNoZWFkZXIuYm9vc3QudXRpbGl0eS5pZGVudGl0eV90eXBlX2hwcCIgdGl0bGU9IkhlYWRlciAmbHQ7Ym9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcCZndDsiPmJvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHA8L2E+Jmd0OworCis8L3NwYW4+Qk9PU1RfSURFTlRJVFlfVFlQRShwYXJlbnRoZXNpemVkX3R5cGUpPC9wcmU+PC9kaXY+PGRpdiBjbGFzcz0icmVmc2VjdDEiIHRpdGxlPSJEZXNjcmlwdGlvbiI+PGEgbmFtZT0iaWQ1NTQyNjIiPjwvYT48aDI+RGVzY3JpcHRpb248L2gyPjxwPjxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPlBhcmFtZXRlcnM6PC9zdHJvbmc+PC9zcGFuPiA8L3A+PGRpdiBjbGFzcz0iaW5mb3JtYWx0YWJsZSI+PHRhYmxlIGNsYXNzPSJ0YWJsZSI+PGNvbGdyb3VwPjxjb2w+PGNvbD48L2NvbGdyb3VwPjx0Ym9keT48dHI+PHRkPjxzcGFuIGNsYXNzPSJib2xkIj48c3Ryb25nPjxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+cGFyZW50aGVzaXplZF90eXBlPC9jb2RlPjwvc3Ryb25nPjwvc3Bhbj48L3RkPjx0ZD5UaGUgdHlwZSBleHByZXNzaW9uIHRvIGJlIHBhc3NlZCBhcyBtYWNybyBwYXJhbWV0ZXIgd3JhcHBlZCBieSBhIHNpbmdsZSBzZXQgb2Ygcm91bmQgcGFyZW50aGVzaXMgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij4oLi4uKTwvY29kZT4uIFRoaXMgdHlwZSBleHByZXNzaW9uIGNhbiBjb250YWluIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgY29tbWFzLiAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj48cD4KKzwvcD48cD5UaGlzIG1hY3JvIHdvcmtzIG9uIGFueSBDKyswMyBjb21waWxlciAoaXQgZG9lcyBub3QgdXNlIHZhcmlhZGljIG1hY3JvcykuPC9wPjxwPlRoaXMgbWFjcm8gbXVzdCBiZSBwcmVmaXhlZCBieSA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPnR5cGVuYW1lPC9jb2RlPiB3aGVuIHVzZWQgd2l0aGluIHRlbXBsYXRlcy4gTm90ZSB0aGF0IHRoZSBjb21waWxlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIGZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2hlbiB0aGV5IGFyZSB3cmFwcGVkIHdpdGggdGhpcyBtYWNybyAodGhlc2UgcGFyYW1ldGVycyBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24gdGVtcGxhdGUpLjwvcD48cD5PbiBzb21lIGNvbXBpbGVycyAobGlrZSBHQ0MpLCB1c2luZyB0aGlzIG1hY3JvIG9uIGFic3RyYWN0IHR5cGVzIHJlcXVpcmVzIHRvIGFkZCBhbmQgcmVtb3ZlIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gPC9wPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImZvb3Rub3RlcyI+PGJyPjxociB3aWR0aD0iMTAwIiBhbGlnbj0ibGVmdCI+PGRpdiBjbGFzcz0iZm9vdG5vdGUiPjxwPjxzdXA+WzxhIGlkPSJmdG4uYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuc29sdXRpb24uZjAiIGhyZWY9IiNib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS5zb2x1dGlvbi5mMCIgY2xhc3M9InBhcmEiPjE8L2E+XSA8L3N1cD4KKyAgICAgICAgVXNpbmcgdmFyaWFkaWMgbWFjcm9zLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byByZXF1aXJlIGEgc2luZ2xlIHNldCBvZiBleHRyYQorICAgICAgICBwYXJlbnRoZXNpcyA8Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJpZGVudGlmaWVyIj5CT09TVF9JREVOVElUWV9UWVBFPC9zcGFuPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4oPC9zcGFuPjwvY29kZT48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PHNwYW4gY2xhc3M9ImVtcGhhc2lzIj48ZW0+dHlwZTwvZW0+PC9zcGFuPjwvY29kZT48Y29kZSBjbGFzcz0iY29tcHV0ZXJvdXRwdXQiPjxzcGFuIGNsYXNzPSJzcGVjaWFsIj4pPC9zcGFuPjwvY29kZT4gaW5zdGVhZCBvZiB0d28gPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48c3BhbiBjbGFzcz0iaWRlbnRpZmllciI+Qk9PU1RfSURFTlRJVFlfVFlQRTwvc3Bhbj48c3BhbiBjbGFzcz0ic3BlY2lhbCI+KCg8L3NwYW4+PC9jb2RlPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48c3BhbiBjbGFzcz0iZW1waGFzaXMiPjxlbT50eXBlPC9lbT48L3NwYW4+PC9jb2RlPjxjb2RlIGNsYXNzPSJjb21wdXRlcm91dHB1dCI+PHNwYW4gY2xhc3M9InNwZWNpYWwiPikpPC9zcGFuPjwvY29kZT4gYnV0IHZhcmlhZGljIG1hY3JvcyBhcmUgbm90IHBhcnQgb2YgQysrMDMKKyAgICAgICAgKGV2ZW4gaWYgbm93YWRheXMgdGhleSBhcmUgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIGNvbXBpbGVycyBhbmQgdGhleSBhcmUKKyAgICAgICAgYWxzbyBwYXJ0IG9mIEMrKzExKS4KKyAgICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJmb290bm90ZSI+PHA+PHN1cD5bPGEgaWQ9ImZ0bi5ib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS50ZW1wbGF0ZXMuZjAiIGhyZWY9IiNib29zdF91dGlsaXR5X2lkZW50aXR5dHlwZS50ZW1wbGF0ZXMuZjAiIGNsYXNzPSJwYXJhIj4yPC9hPl0gPC9zdXA+CisgICAgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGUgY2xhc3M9ImNvbXB1dGVyb3V0cHV0Ij48YSBjbGFzcz0ibGluayIgaHJlZj0iI0JPT1NUX0lERU5USVRZX1RZUEUiIHRpdGxlPSJNYWNybyBCT09TVF9JREVOVElUWV9UWVBFIj5CT09TVF9JREVOVElUWV9UWVBFPC9hPjwvY29kZT4KKyAgICAgICAgd3JhcHMgdGhlIHNwZWNpZmllZCB0eXBlIHdpdGhpbiBhIG1ldGEtZnVuY3Rpb24uCisgICAgICA8L3A+PC9kaXY+PGRpdiBjbGFzcz0iZm9vdG5vdGUiPjxwPjxzdXA+WzxhIGlkPSJmdG4uYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuYW5uZXhfX2ltcGxlbWVudGF0aW9uLmYwIiBocmVmPSIjYm9vc3RfdXRpbGl0eV9pZGVudGl0eXR5cGUuYW5uZXhfX2ltcGxlbWVudGF0aW9uLmYwIiBjbGFzcz0icGFyYSI+MzwvYT5dIDwvc3VwPgorICAgICAgICBUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBtYWNybyBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZCB1c2luZworICAgICAgICB0aGUgY29kZSBsaXN0ZWQgaW4gdGhpcyBkb2N1bWVudGF0aW9uLiBUaGUgbGlzdGVkIGNvZGUgaXMgZm9yIGV4cGxhbmF0b3J5CisgICAgICAgIHB1cnBvc2VzIG9ubHkuCisgICAgICA8L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2lkZW50aXR5X3R5cGUvZG9jL2lkZW50aXR5X3R5cGUucWJrIGIvaWRlbnRpdHlfdHlwZS9kb2MvaWRlbnRpdHlfdHlwZS5xYmsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NzYxNgotLS0gL2Rldi9udWxsCisrKyBiL2lkZW50aXR5X3R5cGUvZG9jL2lkZW50aXR5X3R5cGUucWJrCkBAIC0wLDAgKzEsMTY1IEBACisKK1svIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkgXQorWy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIF0KK1svIChzZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdCBdCitbLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpIF0KK1svIEhvbWUgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5L2lkZW50aXR5X3R5cGUgXQorCitbbGlicmFyeSBCb29zdC5VdGlsaXR5L0lkZW50aXR5VHlwZQorICAgIFtxdWlja2Jvb2sgMS41XQorICAgIFt2ZXJzaW9uIDEuMC4wXQorICAgIFtjb3B5cmlnaHQgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGldCisgICAgW3B1cnBvc2Ugd3JhcHMgdHlwZXMgd2l0aCByb3VuZCBwYXJlbnRoZXNpc10KKyAgICBbbGljZW5zZQorICAgICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKKyAgICAgICAgKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisgICAgICAgIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0XSkKKyAgICBdCisgICAgW2F1dGhvcnMgW0NhbWluaXRpIDxlbWFpbD5sb3JjYW1pbml0aUBnbWFpbC5jb208L2VtYWlsPiwgTG9yZW56b11dCisgICAgW2NhdGVnb3J5IFV0aWxpdGllc10KK10KKworVGhpcyBsaWJyYXJ5IGFsbG93cyB0byB3cmFwIHR5cGVzIHdpdGhpbiByb3VuZCBwYXJlbnRoZXNpcyBzbyB0aGV5IGNhbiBhbHdheXMgYmUgcGFzc2VkIGFzIG1hY3JvIHBhcmFtZXRlcnMuCisKK1tpbXBvcnQgLi4vdGVzdC92YXJfZXJyb3IuY3BwXQorW2ltcG9ydCAuLi90ZXN0L3Zhci5jcHBdCitbaW1wb3J0IC4uL3Rlc3QvdGVtcGxhdGUuY3BwXQorW2ltcG9ydCAuLi90ZXN0L2Fic3RyYWN0LmNwcF0KK1tpbXBvcnQgLi4vdGVzdC9wYXJlbi5jcHBdCisKK1tzZWN0aW9uIE1vdGl2YXRpb25dCisKK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWFjcm8gd2hpY2ggZGVjbGFyZXMgYSB2YXJpYWJsZSBuYW1lZCBgdmFyYFteWyduXV0gd2l0aCB0aGUgc3BlY2lmaWVkIFteWyd0eXBlXV0gKHNlZSBhbHNvIFtALi4vLi4vdGVzdC92YXJfZXJyb3IuY3BwID12YXJfZXJyb3IuY3BwPV0pOgorCitbdmFyX2Vycm9yXQorCitUaGUgZmlyc3QgbWFjcm8gaW52b2NhdGlvbiB3b3JrcyBjb3JyZWN0bHkgZGVjbGFyaW5nIGEgdmFyaWFibGUgbmFtZWQgYHZhcjFgIG9mIHR5cGUgYGludGAuCitIb3dldmVyLCB0aGUgc2Vjb25kIG1hY3JvIGludm9jYXRpb24gZmFpbHMgZ2VuZXJhdGluZyBhIHByZXByb2Nlc3NvciBlcnJvciBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisKK1twcmUKKyAgICBlcnJvcjogbWFjcm8gIlZBUiIgcGFzc2VkIDMgYXJndW1lbnRzLCBidXQgdGFrZXMganVzdCAyCitdCisKK1RoYXQgaXMgYmVjYXVzZSB0aGUgYHN0ZDo6bWFwYCB0eXBlIHBhc3NlZCBhcyB0aGUgZmlyc3QgbWFjcm8gcGFyYW1ldGVyIGNvbnRhaW5zIGEgY29tbWEgYCxgIG5vdCB3cmFwcGVkIGJ5IHJvdW5kIHBhcmVudGhlc2lzIGAoKWAuCitUaGUgcHJlcHJvY2Vzc29yIGludGVycHJldHMgdGhhdCB1bndyYXBwZWQgY29tbWEgYXMgYSBzZXBhcmF0aW9uIGJldHdlZW4gbWFjcm8gcGFyYW1ldGVycyBjb25jbHVkaW5nIHRoYXQgYSB0b3RhbCBvZiB0aHJlZSAoYW5kIG5vdCB0d28pIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgbWFjcm8gaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKworIyBgc3RkOjptYXA8aW50YAorIyBgY2hhcj5gCisjIGAyYAorCitOb3RlIHRoYXQsIGRpZmZlcmVudGx5IGZyb20gdGhlIGNvbXBpbGVyLCB0aGUgcHJlcHJvY2Vzc29yIG9ubHkgcmVjb2duaXplcyByb3VuZCBwYXJlbnRoZXNpcyBgKClgLgorQW5ndWxhciBgPD5gIGFuZCBzcXVhcmVkIGBbXWAgcGFyZW50aGVzaXMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBwcmVwcm9jZXNzb3Igd2hlbiBwYXJzaW5nIG1hY3JvIHBhcmFtZXRlcnMuCisKK1tlbmRzZWN0XQorCitbc2VjdGlvbiBTb2x1dGlvbl0KKworSW4gc29tZSBjYXNlcywgaXQgbWlnaHQgYmUgcG9zc2libGUgdG8gd29ya2Fyb3VuZCB0aGlzIGlzc3VlIGJ5IGF2b2lkaW5nIHRvIHBhc3MgdGhlIHR5cGUgZXhwcmVzc2lvbiB0byB0aGUgbWFjcm8gYWxsIHRvZ2V0aGVyLgorRm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIGFib3ZlIGEgYHR5cGVkZWZgIGNvdWxkIGhhdmUgYmVlbiB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgZXhwcmVzc2lvbiB3aXRoIHRoZSBjb21tYXMgb3V0c2lkZSB0aGUgbWFjcm8gKHNlZSBhbHNvIFtALi4vLi4vdGVzdC92YXIuY3BwID12YXIuY3BwPV0pOgorCitbdmFyX3R5cGVkZWZdCisKK1doZW4gdGhpcyBpcyBuZWl0aGVyIHBvc3NpYmxlIG5vciBkZXNpcmVkIChlLmcuLCBzZWUgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlIGBmYCBpbiB0aGUgc2VjdGlvbiBiZWxvdyksIHRoaXMgbGlicmFyeSBoZWFkZXIgW2hlYWRlcnJlZiBib29zdC91dGlsaXR5L2lkZW50aXR5X3R5cGUuaHBwXSBkZWZpbmVzIGEgbWFjcm8gW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHdvcmthcm91bmQgdGhlIGlzc3VlIHdoaWxlIGtlZXBpbmcgdGhlIHR5cGUgZXhwcmVzc2lvbiBhcyBvbmUgb2YgdGhlIG1hY3JvIHBhcmFtZXRlcnMgKHNlZSBhbHNvIFtALi4vLi4vdGVzdC92YXIuY3BwID12YXIuY3BwPV0pLgorCitbdmFyX29rXQorCitUaGUgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIG1hY3JvIGV4cGFuZHMgdG8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyAoYXQgY29tcGlsZS10aW1lKSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCitUaGUgc3BlY2lmaWVkIHR5cGUgaXMgbmV2ZXIgc3BsaXQgaW50byBtdWx0aXBsZSBtYWNybyBwYXJhbWV0ZXJzIGJlY2F1c2UgaXQgaXMgYWx3YXlzIHdyYXBwZWQgYnkgYSBzZXQgb2YgZXh0cmEgcm91bmQgcGFyZW50aGVzaXMgYCgpYC4KK0luIGZhY3QsIGEgdG90YWwgb2YgdHdvIHNldHMgb2Ygcm91bmQgcGFyZW50aGVzaXMgbXVzdCBiZSB1c2VkOiBUaGUgcGFyZW50aGVzaXMgdG8gaW52b2tlIHRoZSBtYWNybyBgQk9PU1RfSURFTlRJVFlfVFlQRSguLi4pYCBwbHVzIHRoZSBpbm5lciBwYXJlbnRoZXNpcyB0byB3cmFwIHRoZSB0eXBlIHBhc3NlZCB0byB0aGUgbWFjcm8gYEJPT1NUX0lERU5USVRZX1RZUEUoKC4uLikpYC4KKworVGhpcyBtYWNybyB3b3JrcyBvbiBhbnkgW0BodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KVEMxL1NDMjIvV0cyMS9kb2NzL3N0YW5kYXJkcyBDKyswM10gY29tcGlsZXIgKGFuZCBpdCBkb2VzIG5vdCB1c2UgW0BodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhcmlhZGljX21hY3JvIHZhcmlhZGljIG1hY3Jvc10pLgorW2Zvb3Rub3RlCitVc2luZyB2YXJpYWRpYyBtYWNyb3MsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHJlcXVpcmUgYSBzaW5nbGUgc2V0IG9mIGV4dHJhIHBhcmVudGhlc2lzIGBCT09TVF9JREVOVElUWV9UWVBFKGBbXlsndHlwZV1dYClgIGluc3RlYWQgb2YgdHdvIGBCT09TVF9JREVOVElUWV9UWVBFKChgW15bJ3R5cGVdXWApKWAgYnV0IHZhcmlhZGljIG1hY3JvcyBhcmUgbm90IHBhcnQgb2YgQysrMDMgKGV2ZW4gaWYgbm93YWRheXMgdGhleSBhcmUgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIGNvbXBpbGVycyBhbmQgdGhleSBhcmUgYWxzbyBwYXJ0IG9mIEMrKzExKS4KK10KK1RoZSBhdXRob3JzIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgdGhpcyBsaWJyYXJ5IHVzaW5nIEdOVSBDb21waWxlciBDb2xsZWN0aW9uIChHQ0MpIEMrKyA0LjUuMyAod2l0aCBhbmQgd2l0aG91dCBDKysxMSBmZWF0dXJlcyBlbmFibGVkIGAtc3RkPWMrKzB4YCkgb24gQ3lnd2luIGFuZCBNaXNjcm9zb2Z0IFZpc3VhbCBDKysgKE1TVkMpIDguMCBvbiBXaW5kb3dzIDcuCitTZWUgdGhlIGxpYnJhcnkgW0BodHRwOi8vd3d3LmJvb3N0Lm9yZy9kZXZlbG9wbWVudC90ZXN0cy9yZWxlYXNlL2RldmVsb3Blci91dGlsaXR5LWlkZW50aXR5X3R5cGUuaHRtbCByZWdyZXNzaW9ucyB0ZXN0IHJlc3VsdHNdIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1cHBvcnRlZCBjb21waWxlcnMgYW5kIHBsYXRmb3Jtcy4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uIFRlbXBsYXRlc10KKworVGhpcyBtYWNybyBtdXN0IGJlIHByZWZpeGVkIGJ5IGB0eXBlbmFtZWAgd2hlbiB1c2VkIHdpdGhpbiB0ZW1wbGF0ZXMuCitGb3IgZXhhbXBsZSwgbGV0J3MgcHJvZ3JhbSBhIG1hY3JvIHRoYXQgZGVjbGFyZXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgbmFtZWQgYGFyZ2BbXlsnbl1dIHdpdGggdGhlIHNwZWNpZmllZCBbXlsndHlwZV1dIChzZWUgYWxzbyBbQC4uLy4uL3Rlc3QvdGVtcGxhdGUuY3BwID10ZW1wbGF0ZS5jcHA9XSk6CisKK1t0ZW1wbGF0ZV9mX2RlY2xdCitbdGVtcGxhdGVfZl9jYWxsXQorCitIb3dldmVyLCBub3RlIHRoYXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBgY2hhcmAgbXVzdCBiZSBtYW51YWxseSBzcGVjaWZpZWQgd2hlbiBpbnZva2luZyB0aGUgZnVuY3Rpb24gYXMgaW4gYGY8Y2hhcj4oYSlgLgorSW4gZmFjdCwgd2hlbiB0aGUgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIG1hY3JvIGlzIHVzZWQgdG8gd3JhcCBhIGZ1bmN0aW9uIHRlbXBsYXRlIHBhcmFtZXRlciwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBjYW4gbm8gbG9uZ2VyIGJlIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBieSB0aGUgY29tcGlsZXIgZm9ybSB0aGUgZnVuY3Rpb24gY2FsbCBhcyBgZihhKWAgd291bGQgaGF2ZSBkb25lLgorW2Zvb3Rub3RlCitUaGlzIGlzIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIFttYWNyb3JlZiBCT09TVF9JREVOVElUWV9UWVBFXSB3cmFwcyB0aGUgc3BlY2lmaWVkIHR5cGUgd2l0aGluIGEgbWV0YS1mdW5jdGlvbi4KK10KKyhUaGlzIGxpbWl0YXRpb24gZG9lcyBub3QgYXBwbHkgdG8gY2xhc3MgdGVtcGxhdGVzIGJlY2F1c2UgY2xhc3MgdGVtcGxhdGUgcGFyYW1ldGVycyBtdXN0IGFsd2F5cyBiZSBleHBsaWNpdGx5IHNwZWNpZmllZC4pCitJbiBvdGhlciB3b3Jkcywgd2l0aG91dCB1c2luZyB0aGUgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIG1hY3JvLCBDKysgd291bGQgbm9ybWFsbHkgYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRlZHVjZSB0aGUgZnVuY3Rpb24gdGVtcGxhdGUgcGFyYW1ldGVyIGFzIHNob3duIGJlbG93OgorCitbdGVtcGxhdGVfZ19kZWNsXQorW3RlbXBsYXRlX2dfY2FsbF0KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uIEFic3RyYWN0IFR5cGVzXQorCitPbiBzb21lIGNvbXBpbGVycyAoZS5nLiwgR0NDKSwgdXNpbmcgdGhpcyBtYWNybyBvbiBhYnN0cmFjdCB0eXBlcyAoaS5lLiwgY2xhc3NlcyB3aXRoIG9uZSBvciBtb3JlIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMpIGdlbmVyYXRlcyBhIGNvbXBpbGVyIGVycm9yLgorVGhpcyBjYW4gYmUgYXZvaWRlZCBieSBtYW5pcHVsYXRpbmcgdGhlIHR5cGUgYWRkaW5nIGFuZCByZW1vdmluZyBhIHJlZmVyZW5jZSB0byBpdC4KKworTGV0J3MgcHJvZ3JhbSBhIG1hY3JvIHRoYXQgcGVyZm9ybXMgYSBzdGF0aWMgYXNzZXJ0aW9uIG9uIGEgW0BodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RlbXBsYXRlX21ldGFwcm9ncmFtbWluZyBUZW1wbGF0ZSBNZXRhLVByb2dyYW1taW5nXSAoVE1QKSBtZXRhLWZ1bmN0aW9uIChzaW1pbGFybHkgdG8gQm9vc3QuTVBMIFtAaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV8zNl8wL2xpYnMvbXBsL2RvYy9yZWZtYW51YWwvYXNzZXJ0Lmh0bWwgYEJPT1NUX01QTF9BU1NFUlRgXSkuCitUaGUgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIG1hY3JvIGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBtZXRhLWZ1bmN0aW9uIHdpdGggbXVsdGlwbGUgdGVtcGxhdGUgcGFyYW1ldGVycyB0byB0aGUgYXNzZXJ0IG1hY3JvIChzbyB0byBoYW5kbGUgdGhlIGNvbW1hcyBzZXBhcmF0aW5nIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzKS4KK0luIHRoaXMgY2FzZSwgaWYgdGhlIG1ldGEtZnVuY3Rpb24gaXMgYW4gYWJzdHJhY3QgdHlwZSwgaXQgbmVlZHMgdG8gYmUgbWFuaXB1bGF0ZWQgYWRkaW5nIGFuZCByZW1vdmluZyBhIHJlZmVyZW5jZSB0byBpdCAoc2VlIGFsc28gW0AuLi8uLi90ZXN0L2Fic3RyYWN0LmNwcCA9YWJzdHJhY3QuY3BwPV0pOgorCitbYWJzdHJhY3RdCisKK1tlbmRzZWN0XQorCitbc2VjdGlvbiBBbm5leDogVXNhZ2VdCisKK1RoZSBbbWFjcm9yZWYgQk9PU1RfSURFTlRJVFlfVFlQRV0gbWFjcm8gY2FuIGJlIHVzZWQgZWl0aGVyIHdoZW4gY2FsbGluZyBhIHVzZXItZGVmaW5lZCBtYWNybyAoYXMgc2hvd24gYnkgdGhlIGV4YW1wbGVzIHNvIGZhciksIG9yIGludGVybmFsbHkgd2hlbiBpbXBsZW1lbnRpbmcgYSB1c2VyLWRlZmluZWQgbWFjcm8gKGFzIHNob3duIGJlbG93KS4KK1doZW4gW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIGlzIHVzZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyLWRlZmluZWQgbWFjcm8sIHRoZSBjYWxsZXIgb2YgdGhlIHVzZXIgbWFjcm8gd2lsbCBoYXZlIHRvIHNwZWNpZnkgdGhlIGV4dHJhIHBhcmVudGhlc2lzIChzZWUgYWxzbyBbQC4uLy4uL3Rlc3QvcGFyZW4uY3BwID1wYXJlbi5jcHA9XSk6CisKK1twYXJlbl0KKworSG93ZXZlciwgbm90ZSB0aGF0IHRoZSBjYWxsZXIgd2lsbCAvYWx3YXlzLyBoYXZlIHRvIHNwZWNpZnkgdGhlIGV4dHJhIHBhcmVudGhlc2lzIGV2ZW4gd2hlbiB0aGUgbWFjcm8gcGFyYW1ldGVycyBjb250YWluIG5vIGNvbW1hOgorCitbcGFyZW5fYWx3YXlzXQorCitJbiBzb21lIGNhc2VzLCB1c2luZyBbbWFjcm9yZWYgQk9PU1RfSURFTlRJVFlfVFlQRV0gaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2VyLWRlZmluZWQgbWFjcm8gbWlnaHQgcHJvdmlkZSB0aGUgYmVzdCBzeW50YXggZm9yIHRoZSBjYWxsZXIuCitGb3IgZXhhbXBsZSwgdGhpcyBpcyB0aGUgY2FzZSBmb3IgYEJPT1NUX01QTF9BU1NFUlRgIGJlY2F1c2UgdGhlIG1ham9yaXR5IG9mIHRlbXBsYXRlIG1ldGEtcHJvZ3JhbW1pbmcgZXhwcmVzc2lvbnMgY29udGFpbiB1bndyYXBwZWQgY29tbWFzIHNvIGl0IGlzIGxlc3MgY29uZnVzaW5nIGZvciB0aGUgdXNlciB0byBhbHdheXMgc3BlY2lmeSB0aGUgZXh0cmEgcGFyZW50aGVzaXMgYCgoLi4uKSlgIGluc3RlYWQgb2YgdXNpbmcgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdOgorCisgICAgQk9PU1RfTVBMX0FTU0VSVCgoIC8vIE5hdHVyYWwgc3ludGF4LgorICAgICAgICBib29zdDo6bXBsOjphbmRfPAorICAgICAgICAgICAgICBib29zdDo6aXNfY29uc3Q8VD4KKyAgICAgICAgICAgICwgYm9vc3Q6OmlzX3JlZmVyZW5jZTxUPgorICAgICAgICA+CisgICAgKSk7CisKK0hvd2V2ZXIsIGluIG90aGVyIHNpdHVhdGlvbnMgaXQgbWlnaHQgYmUgcHJlZmVyYWJsZSB0byBub3QgcmVxdWlyZSB0aGUgZXh0cmEgcGFyZW50aGVzaXMgaW4gdGhlIGNvbW1vbiBjYXNlcyBhbmQgaGFuZGxlIGNvbW1hcyBhcyBzcGVjaWFsIGNhc2VzIHVzaW5nIFttYWNyb3JlZiBCT09TVF9JREVOVElUWV9UWVBFXS4KK0ZvciBleGFtcGxlLCB0aGlzIGlzIHRoZSBjYXNlIGZvciBbQGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvbG9jYWxfZnVuY3Rpb24gYEJPT1NUX0xPQ0FMX0ZVTkNUSU9OYF0gZm9yIHdoaWNoIGFsd2F5cyByZXF1aXJpbmcgdGhlIGV4dHJhIHBhcmVudGhlc2lzIGAoKC4uLikpYCBhcm91bmQgdGhlIHR5cGVzIHdvdWxkIGxlYWQgdG8gYW4gdW5uYXR1cmFsIHN5bnRheCBmb3IgdGhlIGxvY2FsIGZ1bmN0aW9uIHNpZ25hdHVyZToKKworICAgIGludCBCT09TVF9MT0NBTF9GVU5DVElPTiggKChpbnQmKSkgeCwgKChpbnQmKSkgeSApIHsgLy8gVW5uYXR1cmFsIHN5bnRheC4KKyAgICAgICAgcmV0dXJuIHggKyB5OworICAgIH0gQk9PU1RfTE9DQUxfRlVOQ1RJT05fTkFNRShhZGQpCisKK0luc3RlYWQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIHNwZWNpZnkgW21hY3JvcmVmIEJPT1NUX0lERU5USVRZX1RZUEVdIG9ubHkgd2hlbiBuZWVkZWQgYWxsb3dzIGZvciB0aGUgbW9yZSBuYXR1cmFsIHN5bnRheCBgQk9PU1RfTE9DQUxfRlVOQ1RJT04oaW50JiB4LCBpbnQmIHkpYCBpbiB0aGUgY29tbW9uIGNhc2VzIHdoZW4gdGhlIHBhcmFtZXRlciB0eXBlcyBjb250YWluIG5vIGNvbW1hICh3aGlsZSBzdGlsbCBhbGxvd2luZyB0byBzcGVjaWZ5IHBhcmFtZXRlciB0eXBlcyB3aXRoIGNvbW1hcyBhcyBzcGVjaWFsIGNhc2VzIHVzaW5nIGBCT09TVF9MT0NBTF9GVU5DVElPTihCT09TVF9JREVOVElUWV9UWVBFKChzdGQ6Om1hcDxpbnQsIGNoYXI+KSkmIHgsIGludCYgeSlgKS4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uIEFubmV4OiBJbXBsZW1lbnRhdGlvbl0KKworVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBtYWNybyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmc6CitbZm9vdG5vdGUKK1RoZXJlIGlzIGFic29sdXRlbHkgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIG1hY3JvIGlzIGFjdHVhbGx5IGltcGxlbWVudGVkIHVzaW5nIHRoZSBjb2RlIGxpc3RlZCBpbiB0aGlzIGRvY3VtZW50YXRpb24uCitUaGUgbGlzdGVkIGNvZGUgaXMgZm9yIGV4cGxhbmF0b3J5IHB1cnBvc2VzIG9ubHkuCitdCisKKyAgICAjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvZnVuY3Rpb25fdHJhaXRzLmhwcD4KKyAgICAKKyAgICAjZGVmaW5lIEJPT1NUX0lERU5USVRZX1RZUEUocGFyZW50aGVzaXplZF90eXBlKSBcCisgICAgICAgIGJvb3N0OjpmdW5jdGlvbl90cmFpdHM8dm9pZCBwYXJlbnRoZXNpemVkX3R5cGU+OjphcmcxX3R5cGUKKworRXNzZW50aWFsbHksIHRoZSB0eXBlIGlzIHdyYXBwZWQgYmV0d2VlbiByb3VuZCBwYXJlbnRoZXNpcyBgKHN0ZDo6bWFwPGludCwgY2hhcj4pYCBzbyBpdCBjYW4gYmUgcGFzc2VkIGFzIGEgc2luZ2xlIG1hY3JvIHBhcmFtZXRlciBldmVuIGlmIGl0IGNvbnRhaW5zIGNvbW1hcy4KK1RoZW4gdGhlIHBhcmVudGhlc2l6ZWQgdHlwZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGB2b2lkYCBhbmQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgYXMgdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFuZCBvbmx5IGFyZ3VtZW50IGB2b2lkIChzdGQ6Om1hcDxpbnQsIGNoYXI+KWAuCitGaW5hbGx5LCB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYGFyZzFfdHlwZWAgaXMgZXh0cmFjdGVkIGF0IGNvbXBpbGUtdGltZSB1c2luZyB0aGUgYGZ1bmN0aW9uX3RyYWl0c2AgbWV0YS1mdW5jdGlvbiB0aGVyZWZvcmUgb2J0YWluaW5nIHRoZSBvcmlnaW5hbCB0eXBlIGZyb20gdGhlIHBhcmVudGhlc2l6ZWQgdHlwZSAoZWZmZWN0aXZlbHkgc3RyaXBwaW5nIHRoZSBleHRyYSBwYXJlbnRoZXNpcyBmcm9tIGFyb3VuZCB0aGUgc3BlY2lmaWVkIHR5cGUpLgorCitbZW5kc2VjdF0KKworW3hpbmNsdWRlIHJlZmVyZW5jZS54bWxdCisKZGlmZiAtLWdpdCBhL2lkZW50aXR5X3R5cGUvaW5kZXguaHRtbCBiL2lkZW50aXR5X3R5cGUvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIzMzYyCi0tLSAvZGV2L251bGwKKysrIGIvaWRlbnRpdHlfdHlwZS9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTUgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7IFVSTD1kb2MvaHRtbC9pbmRleC5odG1sIj4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICBBdXRvbWF0aWMgcmVkaXJlY3Rpb24gZmFpbGVkLCBjbGljayB0aGlzIAorICAgIDxhIGhyZWY9ImRvYy9odG1sL2luZGV4Lmh0bWwiPmxpbms8L2E+ICZuYnNwOzxocj4KKyAgICA8cD6pIENvcHlyaWdodCBMb3JlbnpvIENhbWluaXRpLCAyMDA5LTIwMTI8L3A+CisgICAgPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIChzZWUgCisgICAgYWNjb21wYW55aW5nIGZpbGUgPGEgaHJlZj0iLi4vLi4vLi4vTElDRU5TRV8xXzAudHh0Ij4KKyAgICBMSUNFTlNFXzFfMC50eHQ8L2E+IG9yIGEgY29weSBhdAorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+d3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvcD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvaWRlbnRpdHlfdHlwZS90ZXN0L0phbWZpbGUudjIgYi9pZGVudGl0eV90eXBlL3Rlc3QvSmFtZmlsZS52MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I1MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvaWRlbnRpdHlfdHlwZS90ZXN0L0phbWZpbGUudjIKQEAgLTAsMCArMSwxNiBAQAorCisjIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkKKyMgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wCisjIChzZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdAorIyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisjIEhvbWUgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5L2lkZW50aXR5X3R5cGUKKworaW1wb3J0IHRlc3RpbmcgOworCitjb21waWxlLWZhaWwgdmFyX2Vycm9yLmNwcCA7CitydW4gdmFyLmNwcCA7CitydW4gdGVtcGxhdGUuY3BwIDsKK3J1biBhYnN0cmFjdC5jcHAgOworcnVuIG5vbmNvcHlhYmxlLmNwcCA7CitydW4gcGFyZW4uY3BwIDsKKwpkaWZmIC0tZ2l0IGEvaWRlbnRpdHlfdHlwZS90ZXN0L2Fic3RyYWN0LmNwcCBiL2lkZW50aXR5X3R5cGUvdGVzdC9hYnN0cmFjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliMTBjMwotLS0gL2Rldi9udWxsCisrKyBiL2lkZW50aXR5X3R5cGUvdGVzdC9hYnN0cmFjdC5jcHAKQEAgLTAsMCArMSwzNSBAQAorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMiBMb3JlbnpvIENhbWluaXRpCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKKy8vIChzZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8gSG9tZSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvaWRlbnRpdHlfdHlwZQorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hZGRfcmVmZXJlbmNlLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfcmVmZXJlbmNlLmhwcD4KKworLy9bYWJzdHJhY3QKKyNkZWZpbmUgVE1QX0FTU0VSVChtZXRhZnVuY3Rpb24pIFwKKyAgICBCT09TVF9TVEFUSUNfQVNTRVJUKG1ldGFmdW5jdGlvbjo6dmFsdWUpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgYj4KK3N0cnVjdCBhYnN0cmFjdCB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBiOworICAgIHZpcnR1YWwgdm9pZCBmKFQgY29uc3QmIHgpID0gMDsgICAgIC8vIFB1cmUgdmlydHVhbCBmdW5jdGlvbi4KK307CisKK1RNUF9BU1NFUlQoCisgICAgYm9vc3Q6OnJlbW92ZV9yZWZlcmVuY2U8ICAgICAgICAgICAgLy8gQWRkIGFuZCByZW1vdmUKKyAgICAgICAgQk9PU1RfSURFTlRJVFlfVFlQRSgoICAgICAgICAgICAvLyByZWZlcmVuY2UgZm9yCisgICAgICAgICAgICBib29zdDo6YWRkX3JlZmVyZW5jZTwgICAgICAgLy8gYWJzdHJhY3QgdHlwZS4KKyAgICAgICAgICAgICAgICBhYnN0cmFjdDxpbnQsIHRydWU+CisgICAgICAgICAgICA+Ojp0eXBlCisgICAgICAgICkpCisgICAgPjo6dHlwZQorKTsKKy8vXQorCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KKwpkaWZmIC0tZ2l0IGEvaWRlbnRpdHlfdHlwZS90ZXN0L25vbmNvcHlhYmxlLmNwcCBiL2lkZW50aXR5X3R5cGUvdGVzdC9ub25jb3B5YWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxOWU2OAotLS0gL2Rldi9udWxsCisrKyBiL2lkZW50aXR5X3R5cGUvdGVzdC9ub25jb3B5YWJsZS5jcHAKQEAgLTAsMCArMSwyNSBAQAorCisvLyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMiBMb3JlbnpvIENhbWluaXRpCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAKKy8vIChzZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8gSG9tZSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvaWRlbnRpdHlfdHlwZQorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisKKy8vW25vbmNvcHlhYmxlCisjZGVmaW5lIFRNUF9BU1NFUlQobWV0YWZ1bmN0aW9uKSBcCisgICAgQk9PU1RfU1RBVElDX0FTU0VSVChtZXRhZnVuY3Rpb246OnZhbHVlKQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBUIGluaXQ+CitzdHJ1Y3Qgbm9uY29weWFibGUgOiBib29zdDo6bm9uY29weWFibGUgeworICAgIHN0YXRpYyBjb25zdCBUIHZhbHVlID0gaW5pdDsKK307CisKK1RNUF9BU1NFUlQoQk9PU1RfSURFTlRJVFlfVFlQRSgobm9uY29weWFibGU8Ym9vbCwgdHJ1ZT4pKSk7CisvL10KKworaW50IG1haW4oKSB7IHJldHVybiAwOyB9CisKZGlmZiAtLWdpdCBhL2lkZW50aXR5X3R5cGUvdGVzdC9wYXJlbi5jcHAgYi9pZGVudGl0eV90eXBlL3Rlc3QvcGFyZW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYjM1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9pZGVudGl0eV90eXBlL3Rlc3QvcGFyZW4uY3BwCkBAIC0wLDAgKzEsMzUgQEAKKworLy8gQ29weXJpZ2h0IChDKSAyMDA5LTIwMTIgTG9yZW56byBDYW1pbml0aQorLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wCisvLyAoc2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBhIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vIEhvbWUgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5L2lkZW50aXR5X3R5cGUKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY29uc3QuaHBwPgorI2luY2x1ZGUgPG1hcD4KKworLy9bcGFyZW4KKyNkZWZpbmUgVE1QX0FTU0VSVF9QQVJFTihwYXJlbnRoZXNpemVkX21ldGFmdW5jdGlvbikgXAorICAgIC8qIHVzZSBgQk9PU1RfSURFTlRJVFlfVFlQRWAgaW4gbWFjcm8gZGVmaW5pdGlvbiBpbnN0ZWFkIG9mIGludm9jYXRpb24gKi8gXAorICAgIEJPT1NUX1NUQVRJQ19BU1NFUlQoQk9PU1RfSURFTlRJVFlfVFlQRShwYXJlbnRoZXNpemVkX21ldGFmdW5jdGlvbik6OnZhbHVlKQorCisjZGVmaW5lIFRNUF9BU1NFUlQobWV0YWZ1bmN0aW9uKSBcCisgICAgQk9PU1RfU1RBVElDX0FTU0VSVChtZXRhZnVuY3Rpb246OnZhbHVlKQorCisvLyBTcGVjaWZ5IG9ubHkgZXh0cmEgcGFyZW50aGVzaXMgYCgoLi4uKSlgLgorVE1QX0FTU0VSVF9QQVJFTigoYm9vc3Q6OmlzX2NvbnN0PHN0ZDo6bWFwPGludCwgY2hhcj4gY29uc3Q+KSk7CisKKy8vIFNwZWNpZnkgYm90aCB0aGUgZXh0cmEgcGFyZW50aGVzaXMgYCgoLi4uKSlgIGFuZCBgQk9PU1RfSURFTlRJVFlfVFlQRWAgbWFjcm8uCitUTVBfQVNTRVJUKEJPT1NUX0lERU5USVRZX1RZUEUoKGJvb3N0Ojppc19jb25zdDxzdGQ6Om1hcDxpbnQsIGNoYXI+IGNvbnN0PikpKTsKKy8vXQorCisvL1twYXJlbl9hbHdheXMKK1RNUF9BU1NFUlRfUEFSRU4oKGJvb3N0Ojppc19jb25zdDxpbnQgY29uc3Q+KSk7IC8vIEFsd2F5cyBleHRyYSBgKCguLi4pKWAuCisKK1RNUF9BU1NFUlQoYm9vc3Q6OmlzX2NvbnN0PGludCBjb25zdD4pOyAvLyBObyBleHRyYSBgKCguLi4pKWAgYW5kIG5vIG1hY3JvLgorLy9dCisKK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQorCmRpZmYgLS1naXQgYS9pZGVudGl0eV90eXBlL3Rlc3QvdGVtcGxhdGUuY3BwIGIvaWRlbnRpdHlfdHlwZS90ZXN0L3RlbXBsYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmMxMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvaWRlbnRpdHlfdHlwZS90ZXN0L3RlbXBsYXRlLmNwcApAQCAtMCwwICsxLDQ4IEBACisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMAorLy8gKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLyBIb21lIGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9pZGVudGl0eV90eXBlCisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L2lkZW50aXR5X3R5cGUuaHBwPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLy9bdGVtcGxhdGVfZl9kZWNsCisjZGVmaW5lIEFSRyh0eXBlLCBuKSB0eXBlIGFyZyAjIyBuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGYoIC8vIFByZWZpeCBtYWNybyB3aXRoIGB0eXBlbmFtZWAgaW4gdGVtcGxhdGVzLgorICAgIEFSRyh0eXBlbmFtZSBCT09TVF9JREVOVElUWV9UWVBFKChzdGQ6Om1hcDxpbnQsIFQ+KSksIDEpCispIHsKKyAgICBzdGQ6OmNvdXQgPDwgYXJnMVswXSA8PCBzdGQ6OmVuZGw7Cit9CisvL10KKworLy9bdGVtcGxhdGVfZ19kZWNsCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBnKAorICAgIHN0ZDo6bWFwPGludCwgVD4gYXJnMQorKSB7CisgICAgc3RkOjpjb3V0IDw8IGFyZzFbMF0gPDwgc3RkOjplbmRsOworfQorLy9dCisKK2ludCBtYWluKCkgeworICAgIC8vW3RlbXBsYXRlX2ZfY2FsbAorICAgIHN0ZDo6bWFwPGludCwgY2hhcj4gYTsKKyAgICBhWzBdID0gJ2EnOworICAgIAorICAgIGY8Y2hhcj4oYSk7IC8vIE9LLi4uCisgICAgLy8gZihhKTsgICAgLy8gLi4uIGJ1dCBlcnJvci4KKyAgICAvL10KKworICAgIC8vW3RlbXBsYXRlX2dfY2FsbAorICAgIGc8Y2hhcj4oYSk7IC8vIE9LLi4uCisgICAgZyhhKTsgICAgICAgLy8gLi4uIGFuZCBhbHNvIE9LLgorICAgIC8vXQorICAgIAorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9pZGVudGl0eV90eXBlL3Rlc3QvdmFyLmNwcCBiL2lkZW50aXR5X3R5cGUvdGVzdC92YXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDE2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9pZGVudGl0eV90eXBlL3Rlc3QvdmFyLmNwcApAQCAtMCwwICsxLDI2IEBACisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMAorLy8gKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLyBIb21lIGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9pZGVudGl0eV90eXBlCisKKyNpbmNsdWRlIDxtYXA+CisKKyNkZWZpbmUgVkFSKHR5cGUsIG4pIHR5cGUgdmFyICMjIG4KKworVkFSKGludCwgMSk7IC8vIE9LLgorCisvL1t2YXJfdHlwZWRlZgordHlwZWRlZiBzdGQ6Om1hcDxpbnQsIGNoYXI+IG1hcF90eXBlOworVkFSKG1hcF90eXBlLCAzKTsgLy8gT0suCisvL10KKworLy9bdmFyX29rCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcD4KKworVkFSKEJPT1NUX0lERU5USVRZX1RZUEUoKHN0ZDo6bWFwPGludCwgY2hhcj4pKSwgNCk7IC8vIE9LLgorLy9dCisKK2ludCBtYWluKCkgeyByZXR1cm4gMDsgfQorCmRpZmYgLS1naXQgYS9pZGVudGl0eV90eXBlL3Rlc3QvdmFyX2Vycm9yLmNwcCBiL2lkZW50aXR5X3R5cGUvdGVzdC92YXJfZXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjk3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9pZGVudGl0eV90eXBlL3Rlc3QvdmFyX2Vycm9yLmNwcApAQCAtMCwwICsxLDE4IEBACisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMAorLy8gKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLyBIb21lIGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9pZGVudGl0eV90eXBlCisKKyNpbmNsdWRlIDxtYXA+CisKKy8vW3Zhcl9lcnJvcgorI2RlZmluZSBWQVIodHlwZSwgbikgdHlwZSB2YXIgIyMgbgorCitWQVIoaW50LCAxKTsgICAgICAgICAgICAgICAgICAgIC8vIE9LLgorVkFSKHN0ZDo6bWFwPGludCwgY2hhcj4sIDIpOyAgICAvLyBFcnJvci4KKy8vXQorCitpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KKwpkaWZmIC0tZ2l0IGEvaW5fcGxhY2VfZmFjdG9yaWVzLmh0bWwgYi9pbl9wbGFjZV9mYWN0b3JpZXMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWI3ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5fcGxhY2VfZmFjdG9yaWVzLmh0bWwKQEAgLTAsMCArMSwyOTYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vU29mdFF1YWQgU29mdHdhcmUvL0RURCBIb1RNZXRhTCBQUk8gNS4wOjoxOTk4MTIxNzo6ZXh0ZW5zaW9ucyB0byBIVE1MIDQuMC8vRU4iICJobXBybzUuZHRkIj4KKworPEhUTUw+CisKKzxIRUFEPgorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzxUSVRMRT5Jbl9wbGFjZV9mYWN0b3J5IERvY3VtZW50YXRpb248L1RJVExFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBURVhUPSIjMDAwMDAwIiBMSU5LPSIjMDAwMEZGIiBWTElOSz0iIzgwMDA4MCI+Cis8SDIgYWxpZ249ImxlZnQiPjxJTUcgU1JDPSIuLi8uLi9ib29zdC5wbmciIFdJRFRIPSIyNzYiIEhFSUdIVD0iODYiPjwvSDI+CisKKzxibG9ja3F1b3RlPgorICA8YmxvY2txdW90ZT4KKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICA8YmxvY2txdW90ZT4KKzxIMiBhbGlnbj0ibGVmdCI+SGVhZGVyICZsdDs8QQorSFJFRj0iLi4vLi4vYm9vc3QvdXRpbGl0eS9pbl9wbGFjZV9mYWN0b3J5LmhwcCI+Ym9vc3QvdXRpbGl0eS9pbl9wbGFjZV9mYWN0b3J5LmhwcDwvQT4mZ3Q7IDwvSDI+CisKKzxIMiBhbGlnbj0ibGVmdCI+SGVhZGVyICZsdDs8QQorSFJFRj0iLi4vLi4vYm9vc3QvdXRpbGl0eS90eXBlZF9pbl9wbGFjZV9mYWN0b3J5LmhwcCI+Ym9vc3QvdXRpbGl0eS90eXBlZF9pbl9wbGFjZV9mYWN0b3J5LmhwcDwvQT4mZ3Q7IDwvSDI+CisKKyAgICAgICAgICA8L2Jsb2NrcXVvdGU+CisgICAgICAgIDwvYmxvY2txdW90ZT4KKyAgICAgIDwvYmxvY2txdW90ZT4KKyAgICA8L2Jsb2NrcXVvdGU+CisgIDwvYmxvY2txdW90ZT4KKzwvYmxvY2txdW90ZT4KKzxwPiZuYnNwOzwvcD4KKworPEgyPkNvbnRlbnRzPC9IMj4KKzxETCBDTEFTUz0icGFnZS1pbmRleCI+CisgIDxEVD48QSBIUkVGPSIjbW90Ij5Nb3RpdmF0aW9uPC9BPjwvRFQ+CisgIDxEVD48QSBIUkVGPSIjZnJhbWV3b3JrIj5GcmFtZXdvcms8L0E+PC9EVD4KKyAgPERUPjxBIEhSRUY9IiNzcGVjaWZpY2F0aW9uIj5TcGVjaWZpY2F0aW9uPC9BPjwvRFQ+CisgIDxEVD48QSBIUkVGPSIjY29udGFpbmVyLXVzYWdlIj5Db250YWluZXItc2lkZSBVc2FnZTwvQT48L0RUPgorICA8RFQ+PEEgSFJFRj0iI3VzZXItdXNhZ2UiPlVzZXItc2lkZSBVc2FnZTwvQT48L0RUPgorPC9ETD4KKworPEhSPgorCis8SDI+PEEgTkFNRT0ibW90Ij48L0E+TW90aXZhdGlvbjwvSDI+CisKKzxwPlN1cHBvc2Ugd2UgaGF2ZSBhIGNsYXNzPC9wPgorPHByZT5zdHJ1Y3QgWAoreworICBYICggaW50LCBzdGQ6OnN0cmluZyApIDsKK30gOzwvcHJlPgorPHA+QW5kIGEgY29udGFpbmVyIGZvciBpdCB3aGljaCBzdXBwb3J0cyBhbiBlbXB0eSBzdGF0ZSAodGhhdCBpcywgd2hpY2ggY2FuIGNvbnRhaW4gemVybyBvYmplY3RzKTo8L3A+Cis8cHJlPnN0cnVjdCBDCit7CisgICBDKCkgOiBjb250YWluZWRfKDApIHt9CisgIH5DKCkgeyBkZWxldGUgY29udGFpbmVkXyA7IH0KKyAgWCogY29udGFpbmVkXyA7Cit9IDs8L3ByZT4KKzxwPkEgY29udGFpbmVyIGRlc2lnbmVkIHRvIHN1cHBvcnQgYW4gZW1wdHkgc3RhdGUgdHlwaWNhbGx5IGRvZXNuJ3QgcmVxdWlyZSB0aGUgY29udGFpbmVkIHR5cGUgdG8gYmUgRGVmYXVsdENvbnN0cnVjdGlibGUsCitidXQgaXQgdHlwaWNhbGx5IHJlcXVpcmVzIGl0IHRvIGJlIENvcHlDb25zdHJ1Y3RpYmxlIGFzIGEgbWVjaGFuaXNtIHRvCitpbml0aWFsaXplIHRoZSBvYmplY3QgdG8gc3RvcmU6PC9wPgorPHByZT5zdHJ1Y3QgQworeworICAgQygpIDogY29udGFpbmVkXygwKSB7fQorICAgQyAoIFggY29uc3QmIHYgKSA6IGNvbnRhaW5lZF8gKCBuZXcgWCh2KSApIHt9CisgIH5DKCkgeyBkZWxldGUgY29udGFpbmVkXyA7IH0KKyAgWCogY29udGFpbmVkXyA7Cit9IDs8L3ByZT4KKzxwPlRoZXJlIGlzIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGlzOiBzaW5jZSB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc3RvcmVkIG9iamVjdCBpcyBjb3B5IGNvbnN0cnVjdGlvbiwKK3RoZXJlIG11c3QgZXhpc3QgYSBwcmV2aW91c2x5IGNvbnN0cnVjdGVkIHNvdXJjZSBvYmplY3QgdG8gY29weSBmcm9tLiBUaGlzCitvYmplY3QgaXMgbGlrZWx5IHRvIGJlIHRlbXBvcmFyeSBhbmQgc2VydmUgbm8gcHVycG9zZSBiZXNpZGVzIGJlaW5nIHRoZSBzb3VyY2U8L3A+Cis8cHJlPnZvaWQgZm9vKCkKK3sKKyAgLy8gVGVtcG9yYXJ5IG9iamVjdCBjcmVhdGVkLgorICBDIGMoIFgoMTIzLCJoZWxsbyIpICkgOworfQorPC9wcmU+Cis8cD5BIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBpcyB0byBzdXBwb3J0IGRpcmVjdCBjb25zdHJ1Y3Rpb24gb2YgdGhlIGNvbnRhaW5lZAorb2JqZWN0IHJpZ2h0IGluIHRoZSBjb250YWluZXIncyBzdG9yYWdlLjxicj4KK0luIHRoaXMgc2NoZW1lLCB0aGUgdXNlciBzdXBwbGllcyB0aGUgYXJndW1lbnRzIGZvciB0aGUgWCBjb25zdHJ1Y3RvcgorZGlyZWN0bHkgdG8gdGhlIGNvbnRhaW5lcjo8L3A+Cis8cHJlPnN0cnVjdCBDCit7CisgICBDKCkgOiBjb250YWluZWRfKDApIHt9CisgICBDICggWCBjb25zdCYgdiApIDogY29udGFpbmVkXyAoIG5ldyBYKHYpICkge30KKyAgIEMgKCBpbnQgYTAsIHN0ZDo6c3RyaW5nIGExICkgOiBjb250YWluZWRfICggbmV3IFgoYTAsYTEpICkge30KKyAgfkMoKSB7IGRlbGV0ZSBjb250YWluZWRfIDsgfQorICBYKiBjb250YWluZWRfIDsKK30gOzwvcHJlPgorPHByZT52b2lkIGZvbygpCit7CisgIC8vIFdyYXBwZWQgb2JqZWN0IGNvbnN0cnVjdGVkIGluLXBsYWNlCisgIC8vIE5vIHRlbXBvcmFyeSBjcmVhdGVkLgorICBDIGMoMTIzLCJoZWxsbyIpIDsKK30KKzwvcHJlPgorPHA+Q2xlYXJseSwgdGhpcyBzb2x1dGlvbiBkb2Vzbid0IHNjYWxlIHdlbGwgc2luY2UgdGhlIGNvbnRhaW5lciBtdXN0IGR1cGxpY2F0ZSBhbGwgdGhlIGNvbnN0cnVjdG9yIG92ZXJsb2FkcyBmcm9tIHRoZSBjb250YWluZWQgdHlwZQorKGF0IGxlYXN0IGFsbCB0aG9zZSB3aGljaCBhcmUgdG8gYmUgc3VwcG9ydGVkIGRpcmVjdGx5IGluIHRoZSBjb250YWluZXIpLjwvcD4KKworPEgyPjxBIE5BTUU9ImZyYW1ld29yayI+PC9BPkZyYW1ld29yazwvSDI+Cis8cD4KK1RoaXMgbGlicmFyeSBwcm9wb3NlcyBhIGZyYW1ld29yayB0byBhbGxvdyBzb21lIGNvbnRhaW5lcnMgdG8gZGlyZWN0bHkgY29udHJ1Y3QgY29udGFpbmVkIG9iamVjdHMgaW4tcGxhY2Ugd2l0aG91dCByZXF1aXJpbmcKK3RoZSBlbnRpcmUgc2V0IG9mIGNvbnN0cnVjdG9yIG92ZXJsb2FkcyBmcm9tIHRoZSBjb250YWluZWQgdHlwZS4gSXQgYWxzbyBhbGxvd3MgdGhlIGNvbnRhaW5lciB0byByZW1vdmUgdGhlIENvcHlDb25zdHVjdGlibGUKK3JlcXVpcmVtZW50IGZyb20gdGhlIGNvbnRhaW5lZCB0eXBlIHNpbmNlIG9iamVjdHMgY2FuIGJlIGRpcmVjdGx5IGNvbnN0cnVjdGVkIGluLXBsYWNlIHdpdGhvdXQgbmVlZCBvZiBhIGNvcHkuPGJyPgorVGhlIG9ubHkgcmVxdWlyZW1lbnQgb24gdGhlIGNvbnRhaW5lciBpcyB0aGF0IGl0IG11c3QgcHJvdmlkZSBwcm9wZXIgc3RvcmFnZSAodGhhdCBpcywgY29ycmVjdGx5IGFsaWduZWQgYW5kIHNpemVkKS4KK05hdHVyYWxseSwgdGhlIGNvbnRhaW5lciB3aWxsIHR5cGljYWxseSBzdXBwb3J0IHVuaW5pdGlhbGl6ZWQgc3RvcmFnZSB0byBhdm9pZCB0aGUgaW4tcGxhY2UgY29uc3RydWN0aW9uIHRvIG92ZXJyaWRlCithIGZ1bGx5LWNvbnN0cnVjdGVkIG9iamVjdCAoYXMgdGhpcyB3b3VsZCBkZWZlYXQgdGhlIHB1cnBvc2Ugb2YgaW4tcGxhY2UgY29uc3RydWN0aW9uKQorPC9wPgorPHA+Rm9yIHRoaXMgcHVycG9zZSwgdGhlIGZyYW1ld29yayBwcm92aWRlcyB0d28gZmFtaWxpZXMgb2YgY2xhc3NlcyBjb2xsZWN0aXZlbHkgY2FsbGVkOiBJblBsYWNlRmFjdG9yaWVzIGFuZCBUeXBlZEluUGxhY2VGYWN0b3JpZXMuPGJyPgorRXNzZW50aWFsbHksIHRoZXNlIGNsYXNzZXMgaG9sZCBhIHNlcXVlbmNlIG9mIGFjdHVhbCBwYXJhbWV0ZXJzIGFuZCBhIG1ldGhvZCB0byBjb250cnVjdCBhbiBvYmplY3QgaW4gcGxhY2UgdXNpbmcgdGhlc2UgcGFyYW1ldGVycy4KK0VhY2ggbWVtYmVyIG9mIHRoZSBmYW1pbHkgZGlmZmVycyBvbmx5IGluIHRoZSBudW1iZXIgKGFuZCB0eXBlKSBvZiB0aGUgcGFyYW1ldGVyIGxpc3QuIFRoZSBmaXJzdCBmYW1pbHkKK3Rha2VzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gY29uc3RydWN0IGRpcmVjdGx5IGluIG1ldGhvZCBwcm92aWRlZCBmb3IgdGhhdAorcHVycG9zZSwgd2hlcmVhcyB0aGUgc2Vjb25kIGZhbWlseSBpbmNvcnBvcmF0ZXMgdGhhdCB0eXBlIGluIHRoZSBmYWN0b3J5IGNsYXNzCitpdHNlbGYuLjwvcD4KKzxwPkZyb20gdGhlIGNvbnRhaW5lciBQT1YsIHVzaW5nIHRoZSBmcmFtZXdvcmsgYW1vdW50cyB0byBjYWxsaW5nIHRoZSBmYWN0b3J5J3MgbWV0aG9kIHRvIGNvbnRydWN0IHRoZSBvYmplY3QgaW4gcGxhY2UuCitGcm9tIHRoZSB1c2VyIFBPViwgaXQgYW1vdW50cyB0byBjcmVhdGluZyB0aGUgcmlnaHQgZmFjdG9yeSBvYmplY3QgdG8gaG9sZCB0aGUgcGFyYW1ldGVycyBhbmQgcGFzcyBpdCB0byB0aGUgY29udGFpbmVyLjxicj4KK1RoZSBmb2xsb3dpbmcgc2ltcGxpZmllZCBleGFtcGxlIHNob3dzIHRoZSBiYXNpYyBpZGVhLiBBIGNvbXBsZXRlIGV4YW1wbGUgZm9sbG93cyB0aGUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZyYW1ld29yazo8L3A+Cis8cHJlPnN0cnVjdCBDCit7CisgICB0ZW1wbGF0ZSZsdDtjbGFzcyBJblBsYWNlRmFjdG9yeSZndDsKKyAgIEMgKCBJblBsYWNlRmFjdG9yeSBjb25zdCYgYUZhY3RvcnkgKQorICAgIDoKKyAgICBjb250YWluZWRfICggdW5pbml0aWFsaXplZF9zdG9yYWdlKCkgKQorICAgeworICAgICBhRmFjdG9yeS50ZW1wbGF0ZSBhcHBseSZsdDtYJmd0Oyhjb250YWluZWRfKTsKKyAgIH0KKworICB+QygpIAorICB7IAorICAgIGNvbnRhaW5lZF8gLT4gWDo6flgoKTsKKyAgICBkZWxldGVbXSBjb250YWluZWRfIDsgCisgIH0KKworICBjaGFyKiB1bmluaXRpYWxpemVkX3N0b3JhZ2UoKSB7IHJldHVybiBuZXcgY2hhcltzaXplb2YoWCldIDsgfQorCisgIGNoYXIqIGNvbnRhaW5lZF8gOworfSA7CisKK3ZvaWQgZm9vKCkKK3sKKyAgQyBjKCBpbl9wbGFjZSgxMjMsImhlbGxvIikgKSA7Cit9Cis8L3ByZT4KKworPEhSPgorCis8SDI+PEEgTkFNRT0ic3BlY2lmaWNhdGlvbiI+U3BlY2lmaWNhdGlvbjwvQT48L0gyPgorCis8cD5UaGUgZm9sbG93aW5nIGlzIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGZhbWlseSBvZiAnaW5fcGxhY2VfZmFjdG9yeScgY2xhc3NlcywgYWxvbmcgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBoZWxwZXIgdGVtcGxhdGUgZnVuY3Rpb24uCitUaGUgcmVzdCBvZiB0aGUgZmFtaWx5IHZhcmllcyBvbmx5IGluIHRoZSBudW1iZXIgYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGFuZCBjb25zdHJ1Y3RvcikgcGFyYW1ldGVycy48L3A+Cis8UFJFPm5hbWVzcGFjZSBib29zdCB7CisKK3N0cnVjdCBpbl9wbGFjZV9mYWN0b3J5X2Jhc2Uge30gOworCit0ZW1wbGF0ZSZsdDtjbGFzcyBBMCZndDsKK2NsYXNzIGluX3BsYWNlX2ZhY3RvcnkgOiBwdWJsaWMgaW5fcGxhY2VfZmFjdG9yeV9iYXNlCit7CisgIHB1YmxpYzo8L1BSRT4KKworPFBSRT4gICAgaW5fcGxhY2VfZmFjdG9yeSAoIEEwIGNvbnN0JiBhMCApIDogbV9hMChhMCkge30KKworICAgIHRlbXBsYXRlJmx0OyBjbGFzcyBUICZndDsKKyAgICB2b2lkIGFwcGx5ICggdm9pZCogYWRkcmVzcyApIGNvbnN0CisgICAgeworICAgICAgbmV3IChhZGRyZXNzKSBUKG1fYTApOworICAgIH0KKworICBwcml2YXRlOjwvUFJFPgorCis8UFJFPiAgICBBMCBjb25zdCYgbV9hMCA7Cit9IDsKKwordGVtcGxhdGUmbHQ7Y2xhc3MgQTAmZ3Q7Citpbl9wbGFjZV9mYWN0b3J5Jmx0O0EwJmd0OyBpbl9wbGFjZSAoIEEwIGNvbnN0JiBhMCApCit7CisgIHJldHVybiBpbl9wbGFjZV9mYWN0b3J5Jmx0O0EwJmd0OyhhMCk7Cit9Cis8L1BSRT4KKworPHA+U2ltaWxhcmx5LCB0aGUgZm9sbG93aW5nIGlzIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGZhbWlseSBvZiAndHlwZWRfaW5fcGxhY2VfZmFjdG9yeScgY2xhc3NlcywgYWxvbmcgd2l0aCBpdHMgY29ycmVzcG9uZGluZworaGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uLiBUaGUgcmVzdCBvZiB0aGUgZmFtaWx5IHZhcmllcyBvbmx5IGluIHRoZSBudW1iZXIgYW5kIHR5cGUgb2YgdGVtcGxhdGUgKGFuZCBjb25zdHJ1Y3RvcikgcGFyYW1ldGVycy48L3A+Cis8UFJFPm5hbWVzcGFjZSBib29zdCB7CisKK3N0cnVjdCB0eXBlZF9pbl9wbGFjZV9mYWN0b3J5X2Jhc2Uge30gOworCit0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBBMCZndDsKK2NsYXNzIHR5cGVkX2luX3BsYWNlX2ZhY3RvcnkgOiBwdWJsaWMgdHlwZWRfaW5fcGxhY2VfZmFjdG9yeV9iYXNlCit7CisgIHB1YmxpYzo8L1BSRT4KKworPFBSRT4gICAgdHlwZWRfaW5fcGxhY2VfZmFjdG9yeSAoIEEwIGNvbnN0JiBhMCApIDogbV9hMChhMCkge30KKworICAgIHZvaWQgYXBwbHkgKCB2b2lkKiBhZGRyZXNzICkgY29uc3QKKyAgICB7CisgICAgICBuZXcgKGFkZHJlc3MpIFQobV9hMCk7CisgICAgfQorCisgIHByaXZhdGU6PC9QUkU+CisKKzxQUkU+ICAgIEEwIGNvbnN0JiBtX2EwIDsKK30gOworCit0ZW1wbGF0ZSZsdDtjbGFzcyBULCBjbGFzcyBBMCZndDsKK3R5cGVkX2luX3BsYWNlX2ZhY3RvcnkmbHQ7QTAmZ3Q7IGluX3BsYWNlICggQTAgY29uc3QmIGEwICkKK3sKKyAgcmV0dXJuIHR5cGVkX2luX3BsYWNlX2ZhY3RvcnkmbHQ7VCxBMCZndDsoYTApOworfTwvUFJFPgorCis8UFJFPn0KKzwvUFJFPgorCis8cD5BcyB5b3UgY2FuIHNlZSwgdGhlICdpbl9wbGFjZV9mYWN0b3J5JyBhbmQgJ3R5cGVkX2luX3BsYWNlX2ZhY3RvcnknIHRlbXBsYXRlIGNsYXNzZXMgdmFyaWVzIG9ubHkgaW4gdGhlIHdheSB0aGV5IHNwZWNpZnkKK3RoZSB0YXJnZXQgdHlwZTogaW4gdGhlIGZpcnN0IGZhbWlseSwgdGhlIHR5cGUgaXMgZ2l2ZW4gYXMgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0byB0aGUgYXBwbHkgbWVtYmVyIGZ1bmN0aW9uIHdoaWxlIGluIHRoZQorc2Vjb25kIGl0IGlzIGdpdmVuIGRpcmVjdGx5IGFzIHBhcnQgb2YgdGhlIGZhY3RvcnkgY2xhc3MuPGJyPgorV2hlbiB0aGUgY29udGFpbmVyIGhvbGRzIGEgdW5pcXVlIG5vbi1wb2x5bW9ycGhpYyB0eXBlIChzdWNoIGFzIHRoZSBjYXNlIG9mIEJvb3N0Lk9wdGlvbmFsKSwgaXQga25vd3MgdGhlIGV4YWN0IGR5bmFtaWMtdHlwZQorb2YgdGhlIGNvbnRhaW5lZCBvYmplY3QgYW5kIGNhbiBwYXNzIGl0IHRvIHRoZSBhcHBseSgpIG1ldGhvZCBvZiBhIChub24tdHlwZWQpIGZhY3RvcnkuCitJbiB0aGlzIGNhc2UsIGVuZCB1c2VycyBjYW4gdXNlIGFuICdpbl9wbGFjZV9mYWN0b3J5JyBpbnN0YW5jZSB3aGljaCBjYW4gYmUgY29uc3RydWN0ZWQgd2l0aG91dCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGNvbnN0cnVjdC48YnI+CitIb3dldmVyLCBpZiB0aGUgY29udGFpbmVyIGhvbGRzIGhldGVyb2dlbmVvdXMgb3IgcG9seW1vcnBoaWMgb2JqZWN0cyAoc3VjaCBhcyB0aGUgY2FzZSBvZiBCb29zdC5WYXJpYW50KSwgdGhlIGR5bmFtaWMtdHlwZQorb2YgdGhlIG9iamVjdCB0byBiZSBjb25zdHJ1Y3RlZCBtdXN0IGJlIGtub3duIGJ5IHRoZSBmYWN0b3J5IGl0c2xlZi4gSW4gdGhpcyBjYXNlLCBlbmQgdXNlcnMgbXVzdCB1c2UgYSAndHlwZWRfaW5fcGxhY2VfZmFjdG9yeScKK2luc3RlYWQuPC9wPgorCis8SFI+CisKKzxoMj48QSBOQU1FPSJjb250YWluZXItdXNhZ2UiPkNvbnRhaW5lci1zaWRlIFVzYWdlPC9hPjwvaDI+CisKKzxwPkFzIHNob3duIGluIHRoZSBpbnRyb2R1Y3Rvcnkgc2ltcGxpZmllZCBleGFtcGxlLCB0aGUgY29udGFpbmVyIGNsYXNzIG11c3QKK2NvbnRhaW4gbWV0aG9kcyB0aGF0IGFjY2VwdCBhbiBpbnN0YW5jZSBvZgordGhlc2UgZmFjdG9yaWVzIGFuZCBwYXNzIHRoZSBvYmplY3QncyBzdG9yYWdlIHRvIHRoZSBmYWN0b3J5J3MgYXBwbHkgbWV0aG9kLjxicj4KK0hvd2V2ZXIsIHRoZSB0eXBlIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGNhbm5vdCBiZSBjb21wbGV0bHkgc3BlY2lmaWVkIGluIHRoZSBjb250YWluZXIgY2xhc3MgYmVjYXVzZSB0aGF0IHdvdWxkCitkZWZlYXQgdGhlIHdob2xlIHB1cnBvc2Ugb2YgdGhlIGZhY3RvcmllcyB3aGljaCBpcyB0byBhbGxvdyB0aGUgY29udGFpbmVyIHRvIGFjY2VwdCBhIHZhcmlhZGljIGFyZ3VtZW50IGxpc3QKK2ZvciB0aGUgY29uc3RydWN0b3Igb2YgaXRzIGNvbnRhaW5lZCBvYmplY3QuPGJyPgorVGhlIGNvcnJlY3QgZnVuY3Rpb24gb3ZlcmxvYWQgbXVzdCBiZSBiYXNlZCBvbiB0aGUgb25seSBkaXN0aW5jdGl2ZSBhbmQgY29tbW9uCitjaGFyYWN0ZXJpc3RpYyBvZiBhbGwgdGhlIGNsYXNzZXMgaW4gZWFjaCBmYW1pbHksIHRoZSBiYXNlIGNsYXNzLjxicj4KK0RlcGVuZGluZyBvbiB0aGUgY29udGFpbmVyIGNsYXNzLCB5b3UgY2FuIHVzZSAnZW5hYmxlX2lmJyB0byBnZW5lcmF0ZSB0aGUgcmlnaHQgb3ZlcmxvYWQsIG9yIHVzZSB0aGUgZm9sbG93aW5nCitkaXNwYXRjaCB0ZWNobmlxdWUgKHVzZWQgaW4gdGhlIEJvb3N0Lk9wdGlvbmFsIGNsYXNzKToKKzwvcD4KKzxwcmU+c3RydWN0IEMKK3sKKyAgIEMoKSA6IGNvbnRhaW5lZF8oMCkge30KKyAgIEMgKCBYIGNvbnN0JiB2ICkgOiBjb250YWluZWRfICggbmV3IFgodikgKSB7fQorCisgICB0ZW1wbGF0ZSZsdDtjbGFzcyBFeHByJmd0CisgICBDICggRXhwciBjb25zdCYgZXhwciApCisgICAgOgorICAgIGNvbnRhaW5lZF8gKCB1bmluaXRpYWxpemVkX3N0b3JhZ2UoKSApCisgICB7CisgICAgY29uc3RydWN0KGV4cHIsJmV4cHIpCisgICB9CisKKyAgfkMoKSB7IGRlbGV0ZSBjb250YWluZWRfIDsgfQorCisgIHRlbXBsYXRlJmx0O2NsYXNzIEluUGxhY2VGYWN0b3J5Jmd0OworICB2b2lkIGNvbnN0cnVjdCAoIEluUGxhY2VGYWN0b3J5IGNvbnN0JiBhRmFjdG9yeSwgYm9vc3Q6OmluX3BsYWNlX2ZhY3RvcnlfYmFzZSogKQorICB7CisgICAgYUZhY3RvcnkudGVtcGxhdGUgYXBwbHkmbHQ7WCZndDsoY29udGFpbmVkXyk7CisgIH0KKworICB0ZW1wbGF0ZSZsdDtjbGFzcyBUeXBlZEluUGxhY2VGYWN0b3J5Jmd0OworICB2b2lkIGNvbnN0cnVjdCAoIFR5cGVkSW5QbGFjZUZhY3RvcnkgY29uc3QmIGFGYWN0b3J5LCBib29zdDo6dHlwZWRfaW5fcGxhY2VfZmFjdG9yeV9iYXNlKiApCisgIHsKKyAgICBhRmFjdG9yeS5hcHBseShjb250YWluZWRfKTsKKyAgfQorCisgIFgqIHVuaW5pdGlhbGl6ZWRfc3RvcmFnZSgpIHsgcmV0dXJuIHN0YXRpY19jYXN0Jmx0O1gqJmd0OyhuZXcgY2hhcltzaXplb2YoWCldKSA7IH0KKworICBYKiBjb250YWluZWRfIDsKK30gOworPC9wcmU+CisKKzxocj4KKworPGgyPjxBIE5BTUU9InVzZXItdXNhZ2UiPlVzZXItc2lkZSBVc2FnZTwvYT48L2gyPgorCis8cD5FbmQgdXNlcnMgcGFzcyB0byB0aGUgY29udGFpbmVyIGFuIGluc3RhbmNlIG9mIGEgZmFjdG9yeSBvYmplY3QgaG9sZGluZyB0aGUgYWN0dWFsIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGNvbnN0cnVjdCB0aGUKK2NvbnRhaW5lZCBvYmplY3QgZGlyZWN0bHkgd2l0aGluIHRoZSBjb250YWluZXIuIEZvciB0aGlzLCB0aGUgaGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uICdpbl9wbGFjZScgaXMgdXNlZC48YnI+CitUaGUgY2FsbCAnaW5fcGxhY2UoYTAsYTEsYTIsLi4uLGFuKScgY29uc3RydWN0cyBhIChub24tdHlwZWQpICdpbl9wbGFjZV9mYWN0b3J5JyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCBsaXN0Ljxicj4KK1RoZSBjYWxsICdpbl9wbGFjZSZsdDtUJmd0OyhhMCxhMSxhMiwuLi4sYW4pJyBjb25zdHJ1Y3RzIGEgJ3R5cGVkX2luX3BsYWNlX2ZhY3RvcnknIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50IGxpc3QgZm9yIHRoZQordHlwZSAnVCcuPC9wPgorPHByZT52b2lkIGZvbygpCit7CisgIEMgYSggaW5fcGxhY2UoMTIzLCJoZWxsbyIpICkgOyAgICAvLyBpbl9wbGFjZV9mYWN0b3J5IHBhc3NlZAorICBDIGIoIGluX3BsYWNlJmx0O1gmZ3Q7KDQ1Niwid29ybGQiKSApIDsgLy8gdHlwZWRfaW5fcGxhY2VfZmFjdG9yeSBwYXNzZWQKK30KKzwvcHJlPgorCis8UD5SZXZpc2VkIFNlcHRlbWJlciAxNywgMjAwNDwvUD4KKzxwPqkgQ29weXJpZ2h0IEZlcm5hbmRvIEx1aXMgQ2FjY2lvbGEgQ2FyYmFsbGFsLCAyMDA0PC9wPgorPHA+IFVzZSwgbW9kaWZpY2F0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgPGEgaHJlZj0iLi4vLi4vTElDRU5TRV8xXzAudHh0Ij4KK0xJQ0VOU0VfMV8wLnR4dDwvYT4gb3IgY29weSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPgord3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+KTwvcD4KKzxQPkRldmVsb3BlZCBieSA8QSBIUkVGPSJtYWlsdG86ZmVybmFuZG9fY2FjY2lvbGFAaG90bWFpbC5jb20iPkZlcm5hbmRvIENhY2Npb2xhPC9BPiwKK3RoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0IDxBCitIUkVGPSJodHRwOi8vd3d3LmJvb3N0Lm9yZyI+d3d3LmJvb3N0Lm9yZzwvQT4sIGFuZCB0aGUgYm9vc3QKKzxBIEhSRUY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL21vcmUvbWFpbGluZ19saXN0cy5odG0jbWFpbiI+ZGlzY3Vzc2lvbiBsaXN0czwvQT48L1A+Cis8L0JPRFk+Cis8L0hUTUw+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L2NhbGxfdHJhaXRzLmhwcCBiL2luY2x1ZGUvYm9vc3QvY2FsbF90cmFpdHMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L2NhbGxfdHJhaXRzLmhwcApAQCAtMCwwICsxLDIwIEBACisvLyAgKEMpIENvcHlyaWdodCBTdGV2ZSBDbGVhcnksIEJlbWFuIERhd2VzLCBIb3dhcmQgSGlubmFudCAmIEpvaG4gTWFkZG9jayAyMDAwLgorLy8gIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsCisvLyAgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpLgorLy8KKy8vICBTZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5IGZvciBtb3N0IHJlY2VudCB2ZXJzaW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uLgorCisvLyAgU2VlIGJvb3N0L2RldGFpbC9jYWxsX3RyYWl0cy5ocHAKKy8vICBmb3IgZnVsbCBjb3B5cmlnaHQgbm90aWNlcy4KKworI2lmbmRlZiBCT09TVF9DQUxMX1RSQUlUU19IUFAKKyNkZWZpbmUgQk9PU1RfQ0FMTF9UUkFJVFNfSFBQCisKKyNpZm5kZWYgQk9PU1RfQ09ORklHX0hQUAorI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L2RldGFpbC9jYWxsX3RyYWl0cy5ocHA+CisKKyNlbmRpZiAvLyBCT09TVF9DQUxMX1RSQUlUU19IUFAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm9vc3QvY29tcHJlc3NlZF9wYWlyLmhwcCBiL2luY2x1ZGUvYm9vc3QvY29tcHJlc3NlZF9wYWlyLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2JlMGYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC9jb21wcmVzc2VkX3BhaXIuaHBwCkBAIC0wLDAgKzEsMjAgQEAKKy8vICAoQykgQ29weXJpZ2h0IFN0ZXZlIENsZWFyeSwgQmVtYW4gRGF3ZXMsIEhvd2FyZCBIaW5uYW50ICYgSm9obiBNYWRkb2NrIDIwMDAuCisvLyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwKKy8vICBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkuCisvLworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkgZm9yIG1vc3QgcmVjZW50IHZlcnNpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24uCisKKy8vICBTZWUgYm9vc3QvZGV0YWlsL2NvbXByZXNzZWRfcGFpci5ocHAKKy8vICBmb3IgZnVsbCBjb3B5cmlnaHQgbm90aWNlcy4KKworI2lmbmRlZiBCT09TVF9DT01QUkVTU0VEX1BBSVJfSFBQCisjZGVmaW5lIEJPT1NUX0NPTVBSRVNTRURfUEFJUl9IUFAKKworI2lmbmRlZiBCT09TVF9DT05GSUdfSFBQCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2NvbXByZXNzZWRfcGFpci5ocHA+CisKKyNlbmRpZiAvLyBCT09TVF9DT01QUkVTU0VEX1BBSVJfSFBQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L2RldGFpbC9jYWxsX3RyYWl0cy5ocHAgYi9pbmNsdWRlL2Jvb3N0L2RldGFpbC9jYWxsX3RyYWl0cy5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkZWEwMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvZGV0YWlsL2NhbGxfdHJhaXRzLmhwcApAQCAtMCwwICsxLDE3MiBAQAorLy8gIChDKSBDb3B5cmlnaHQgU3RldmUgQ2xlYXJ5LCBCZW1hbiBEYXdlcywgSG93YXJkIEhpbm5hbnQgJiBKb2huIE1hZGRvY2sgMjAwMC4KKy8vICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGFyZSBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLAorLy8gIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KS4KKy8vCisvLyAgU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eSBmb3IgbW9zdCByZWNlbnQgdmVyc2lvbiBpbmNsdWRpbmcgZG9jdW1lbnRhdGlvbi4KKworLy8gY2FsbF90cmFpdHM6IGRlZmluZXMgdHlwZWRlZnMgZm9yIGZ1bmN0aW9uIHVzYWdlCisvLyAoc2VlIGxpYnMvdXRpbGl0eS9jYWxsX3RyYWl0cy5odG0pCisKKy8qIFJlbGVhc2Ugbm90ZXM6CisgICAyM3JkIEp1bHkgMjAwMDoKKyAgICAgIEZpeGVkIGFycmF5IHNwZWNpYWxpemF0aW9uLiAoSk0pCisgICAgICBBZGRlZCBCb3JsYW5kIHNwZWNpZmljIGZpeGVzIGZvciByZWZlcmVuY2UgdHlwZXMKKyAgICAgIChpc3N1ZSByYWlzZWQgYnkgU3RldmUgQ2xlYXJ5KS4KKyovCisKKyNpZm5kZWYgQk9PU1RfREVUQUlMX0NBTExfVFJBSVRTX0hQUAorI2RlZmluZSBCT09TVF9ERVRBSUxfQ0FMTF9UUkFJVFNfSFBQCisKKyNpZm5kZWYgQk9PU1RfQ09ORklHX0hQUAorI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjZW5kaWYKKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfYXJpdGhtZXRpYy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfZW51bS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfcG9pbnRlci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL3dvcmthcm91bmQuaHBwPgorCituYW1lc3BhY2UgYm9vc3R7CisKK25hbWVzcGFjZSBkZXRhaWx7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIHNtYWxsXz4KK3N0cnVjdCBjdF9pbXAyCit7CisgICB0eXBlZGVmIGNvbnN0IFQmIHBhcmFtX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBjdF9pbXAyPFQsIHRydWU+Cit7CisgICB0eXBlZGVmIGNvbnN0IFQgcGFyYW1fdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzcCwgYm9vbCBiMSwgYm9vbCBiMj4KK3N0cnVjdCBjdF9pbXAKK3sKKyAgIHR5cGVkZWYgY29uc3QgVCYgcGFyYW1fdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzcCwgYm9vbCBiMj4KK3N0cnVjdCBjdF9pbXA8VCwgaXNwLCB0cnVlLCBiMj4KK3sKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY3RfaW1wMjxULCBzaXplb2YoVCkgPD0gc2l6ZW9mKHZvaWQqKT46OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGlzcCwgYm9vbCBiMT4KK3N0cnVjdCBjdF9pbXA8VCwgaXNwLCBiMSwgdHJ1ZT4KK3sKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY3RfaW1wMjxULCBzaXplb2YoVCkgPD0gc2l6ZW9mKHZvaWQqKT46OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIGIxLCBib29sIGIyPgorc3RydWN0IGN0X2ltcDxULCB0cnVlLCBiMSwgYjI+Cit7CisgICB0eXBlZGVmIGNvbnN0IFQgcGFyYW1fdHlwZTsKK307CisKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgY2FsbF90cmFpdHMKK3sKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOworICAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CisgICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgIC8vCisgICAvLyBDKysgQnVpbGRlciB3b3JrYXJvdW5kOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkZWZpbmUgYSBjb21waWxlIHRpbWUKKyAgIC8vIGNvbnN0YW50IGFuZCBwYXNzIHRoYXQgYXMgYSBzaW5nbGUgdGVtcGxhdGUgcGFyYW1ldGVyIHRvIGN0X2ltcDxULGJvb2w+LAorICAgLy8gaG93ZXZlciBjb21waWxlciBidWdzIHByZXZlbnQgdGhpcyAtIGluc3RlYWQgcGFzcyB0aHJlZSBib29sJ3MgdG8KKyAgIC8vIGN0X2ltcDxULGJvb2wsYm9vbCxib29sPiBhbmQgYWRkIGFuIGV4dHJhIHBhcnRpYWwgc3BlY2lhbGlzYXRpb24KKyAgIC8vIG9mIGN0X2ltcCB0byBoYW5kbGUgdGhlIGxvZ2ljLiAoSk0pCisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpkZXRhaWw6OmN0X2ltcDwKKyAgICAgIFQsCisgICAgICA6OmJvb3N0Ojppc19wb2ludGVyPFQ+Ojp2YWx1ZSwKKyAgICAgIDo6Ym9vc3Q6OmlzX2FyaXRobWV0aWM8VD46OnZhbHVlLAorICAgICAgOjpib29zdDo6aXNfZW51bTxUPjo6dmFsdWUKKyAgID46OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNhbGxfdHJhaXRzPFQmPgoreworICAgdHlwZWRlZiBUJiB2YWx1ZV90eXBlOworICAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CisgICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgVCYgcGFyYW1fdHlwZTsgIC8vIGhoIHJlbW92ZWQgY29uc3QKK307CisKKyNpZiBCT09TVF9XT1JLQVJPVU5EKCBfX0JPUkxBTkRDX18sICA8IDB4NUEwICkKKy8vIHRoZXNlIGFyZSBpbGxlZ2FsIHNwZWNpYWxpc2F0aW9uczsgY3YtcXVhbGlmaWVzIGFwcGxpZWQgdG8KKy8vIHJlZmVyZW5jZXMgaGF2ZSBubyBlZmZlY3QgYWNjb3JkaW5nIHRvIFs4LjMuMnAxXSwKKy8vIEMrKyBCdWlsZGVyIHJlcXVpcmVzIHRoZW0gdGhvdWdoIGFzIGl0IHRyZWF0cyBjdi1xdWFsaWZpZWQKKy8vIHJlZmVyZW5jZXMgYXMgZGlzdGluY3QgdHlwZXMuLi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNhbGxfdHJhaXRzPFQmY29uc3Q+Cit7CisgICB0eXBlZGVmIFQmIHZhbHVlX3R5cGU7CisgICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKKyAgIHR5cGVkZWYgY29uc3QgVCYgY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiBUJiBwYXJhbV90eXBlOyAgLy8gaGggcmVtb3ZlZCBjb25zdAorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNhbGxfdHJhaXRzPFQmdm9sYXRpbGU+Cit7CisgICB0eXBlZGVmIFQmIHZhbHVlX3R5cGU7CisgICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKKyAgIHR5cGVkZWYgY29uc3QgVCYgY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiBUJiBwYXJhbV90eXBlOyAgLy8gaGggcmVtb3ZlZCBjb25zdAorfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNhbGxfdHJhaXRzPFQmY29uc3Qgdm9sYXRpbGU+Cit7CisgICB0eXBlZGVmIFQmIHZhbHVlX3R5cGU7CisgICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKKyAgIHR5cGVkZWYgY29uc3QgVCYgY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiBUJiBwYXJhbV90eXBlOyAgLy8gaGggcmVtb3ZlZCBjb25zdAorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgY2FsbF90cmFpdHM8IFQgKiA+Cit7CisgICB0eXBlZGVmIFQgKiB2YWx1ZV90eXBlOworICAgdHlwZWRlZiBUICogJiByZWZlcmVuY2U7CisgICB0eXBlZGVmIFQgKiBjb25zdCAmIGNvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgVCAqIGNvbnN0IHBhcmFtX3R5cGU7ICAvLyBoaCByZW1vdmVkIGNvbnN0Cit9OworI2VuZGlmCisjaWYgIWRlZmluZWQoQk9PU1RfTk9fQVJSQVlfVFlQRV9TUEVDSUFMSVpBVElPTlMpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4KK3N0cnVjdCBjYWxsX3RyYWl0czxUIFtOXT4KK3sKK3ByaXZhdGU6CisgICB0eXBlZGVmIFQgYXJyYXlfdHlwZVtOXTsKK3B1YmxpYzoKKyAgIC8vIGRlZ3JhZGVzIGFycmF5IHRvIHBvaW50ZXI6CisgICB0eXBlZGVmIGNvbnN0IFQqIHZhbHVlX3R5cGU7CisgICB0eXBlZGVmIGFycmF5X3R5cGUmIHJlZmVyZW5jZTsKKyAgIHR5cGVkZWYgY29uc3QgYXJyYXlfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiBjb25zdCBUKiBjb25zdCBwYXJhbV90eXBlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+CitzdHJ1Y3QgY2FsbF90cmFpdHM8Y29uc3QgVCBbTl0+Cit7Citwcml2YXRlOgorICAgdHlwZWRlZiBjb25zdCBUIGFycmF5X3R5cGVbTl07CitwdWJsaWM6CisgICAvLyBkZWdyYWRlcyBhcnJheSB0byBwb2ludGVyOgorICAgdHlwZWRlZiBjb25zdCBUKiB2YWx1ZV90eXBlOworICAgdHlwZWRlZiBhcnJheV90eXBlJiByZWZlcmVuY2U7CisgICB0eXBlZGVmIGNvbnN0IGFycmF5X3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgY29uc3QgVCogY29uc3QgcGFyYW1fdHlwZTsKK307CisjZW5kaWYKKworfQorCisjZW5kaWYgLy8gQk9PU1RfREVUQUlMX0NBTExfVFJBSVRTX0hQUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC9kZXRhaWwvY29tcHJlc3NlZF9wYWlyLmhwcCBiL2luY2x1ZGUvYm9vc3QvZGV0YWlsL2NvbXByZXNzZWRfcGFpci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRjMjFlMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvZGV0YWlsL2NvbXByZXNzZWRfcGFpci5ocHAKQEAgLTAsMCArMSw0NDMgQEAKKy8vICAoQykgQ29weXJpZ2h0IFN0ZXZlIENsZWFyeSwgQmVtYW4gRGF3ZXMsIEhvd2FyZCBIaW5uYW50ICYgSm9obiBNYWRkb2NrIDIwMDAuCisvLyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwKKy8vICBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkuCisvLworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkgZm9yIG1vc3QgcmVjZW50IHZlcnNpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24uCisKKy8vIGNvbXByZXNzZWRfcGFpcjogcGFpciB0aGF0ICJjb21wcmVzc2VzIiBlbXB0eSBtZW1iZXJzCisvLyAoc2VlIGxpYnMvdXRpbGl0eS9kb2MvaHRtbC9jb21wcmVzc2VkX3BhaXIuaHRtbCkKKy8vCisvLyBKTSBjaGFuZ2VzIDI1IEphbiAyMDA0OgorLy8gRm9yIHRoZSBjYXNlIHdoZXJlIFQxID09IFQyIGFuZCBib3RoIGFyZSBlbXB0eSwgdGhlbiBmaXJzdCgpIGFuZCBzZWNvbmQoKQorLy8gc2hvdWxkIHJldHVybiBkaWZmZXJlbnQgb2JqZWN0cy4KKy8vIEpNIGNoYW5nZXMgMjUgSmFuIDIwMDA6CisvLyBSZW1vdmVkIGRlZmF1bHQgYXJndW1lbnRzIGZyb20gY29tcHJlc3NlZF9wYWlyX3N3aXRjaCB0byBnZXQKKy8vIEMrKyBCdWlsZGVyIDQgdG8gYWNjZXB0IHRoZW0KKy8vIHJld3JpdGVuIHN3YXAgdG8gZ2V0IGdjYyBhbmQgQysrIGJ1aWxkZXIgdG8gY29tcGlsZS4KKy8vIGFkZGVkIHBhcnRpYWwgc3BlY2lhbGlzYXRpb25zIGZvciBjYXNlIFQxID09IFQyIHRvIGF2b2lkIGR1cGxpY2F0ZSBjb25zdHJ1Y3RvciBkZWZzLgorCisjaWZuZGVmIEJPT1NUX0RFVEFJTF9DT01QUkVTU0VEX1BBSVJfSFBQCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DT01QUkVTU0VEX1BBSVJfSFBQCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfY3YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2VtcHR5LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jYWxsX3RyYWl0cy5ocHA+CisKKyNpZmRlZiBCT09TVF9NU1ZDCisjIHByYWdtYSB3YXJuaW5nKHB1c2gpCisjIHByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDUxMikKKyNlbmRpZiAKK25hbWVzcGFjZSBib29zdAoreworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyOworCisKKy8vIGNvbXByZXNzZWRfcGFpcgorCituYW1lc3BhY2UgZGV0YWlscworeworICAgLy8gSk0gYWx0ZXJlZCAyNiBKYW4gMjAwMDoKKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDIsIGJvb2wgSXNTYW1lLCBib29sIEZpcnN0RW1wdHksIGJvb2wgU2Vjb25kRW1wdHk+CisgICBzdHJ1Y3QgY29tcHJlc3NlZF9wYWlyX3N3aXRjaDsKKworICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgIHN0cnVjdCBjb21wcmVzc2VkX3BhaXJfc3dpdGNoPFQxLCBUMiwgZmFsc2UsIGZhbHNlLCBmYWxzZT4KKyAgICAgIHtzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDt9OworCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IGNvbXByZXNzZWRfcGFpcl9zd2l0Y2g8VDEsIFQyLCBmYWxzZSwgdHJ1ZSwgdHJ1ZT4KKyAgICAgIHtzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMzt9OworCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IGNvbXByZXNzZWRfcGFpcl9zd2l0Y2g8VDEsIFQyLCBmYWxzZSwgdHJ1ZSwgZmFsc2U+CisgICAgICB7c3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDE7fTsKKworICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgIHN0cnVjdCBjb21wcmVzc2VkX3BhaXJfc3dpdGNoPFQxLCBUMiwgZmFsc2UsIGZhbHNlLCB0cnVlPgorICAgICAge3N0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSAyO307CisKKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBzdHJ1Y3QgY29tcHJlc3NlZF9wYWlyX3N3aXRjaDxUMSwgVDIsIHRydWUsIHRydWUsIHRydWU+CisgICAgICB7c3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IDQ7fTsKKworICAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgIHN0cnVjdCBjb21wcmVzc2VkX3BhaXJfc3dpdGNoPFQxLCBUMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlPgorICAgICAge3N0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSA1O307CisKKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDIsIGludCBWZXJzaW9uPiBjbGFzcyBjb21wcmVzc2VkX3BhaXJfaW1wOworCisjaWZkZWYgX19HTlVDX18KKyAgIC8vIHdvcmthcm91bmQgZm9yIEdDQyAoSk0pOgorICAgdXNpbmcgc3RkOjpzd2FwOworI2VuZGlmCisgICAvLworICAgLy8gY2FuJ3QgY2FsbCB1bnF1YWxpZmllZCBzd2FwIGZyb20gd2l0aGluIGNsYXNzbmFtZTo6c3dhcAorICAgLy8gYXMgS29lbmlnIGxvb2t1cCBydWxlcyB3aWxsIGZpbmQgb25seSB0aGUgY2xhc3NuYW1lOjpzd2FwCisgICAvLyBtZW1iZXIgZnVuY3Rpb24gbm90IHRoZSBnbG9iYWwgZGVjbGFyYXRpb24sIHNvIHVzZSBjcF9zd2FwCisgICAvLyBhcyBhIGZvcndhcmRpbmcgZnVuY3Rpb24gKEpNKToKKyAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgaW5saW5lIHZvaWQgY3Bfc3dhcChUJiB0MSwgVCYgdDIpCisgICB7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICB1c2luZyBzdGQ6OnN3YXA7CisjZW5kaWYKKyAgICAgIHN3YXAodDEsIHQyKTsKKyAgIH0KKworICAgLy8gMCAgICBkZXJpdmUgZnJvbSBuZWl0aGVyCisKKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBjbGFzcyBjb21wcmVzc2VkX3BhaXJfaW1wPFQxLCBUMiwgMD4KKyAgIHsKKyAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgY29tcHJlc3NlZF9wYWlyX2ltcCgpIHt9IAorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogZmlyc3RfKHgpLCBzZWNvbmRfKHkpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoZmlyc3RfcGFyYW1fdHlwZSB4KQorICAgICAgICAgOiBmaXJzdF8oeCkge30KKworICAgICAgY29tcHJlc3NlZF9wYWlyX2ltcChzZWNvbmRfcGFyYW1fdHlwZSB5KQorICAgICAgICAgOiBzZWNvbmRfKHkpIHt9CisKKyAgICAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHtyZXR1cm4gZmlyc3RfO30KKyAgICAgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZSBmaXJzdCgpIGNvbnN0IHtyZXR1cm4gZmlyc3RfO30KKworICAgICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7cmV0dXJuIHNlY29uZF87fQorICAgICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7cmV0dXJuIHNlY29uZF87fQorCisgICAgICB2b2lkIHN3YXAoOjpib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLCBUMj4mIHkpCisgICAgICB7CisgICAgICAgICBjcF9zd2FwKGZpcnN0XywgeS5maXJzdCgpKTsKKyAgICAgICAgIGNwX3N3YXAoc2Vjb25kXywgeS5zZWNvbmQoKSk7CisgICAgICB9CisgICBwcml2YXRlOgorICAgICAgZmlyc3RfdHlwZSBmaXJzdF87CisgICAgICBzZWNvbmRfdHlwZSBzZWNvbmRfOworICAgfTsKKworICAgLy8gMSAgICBkZXJpdmUgZnJvbSBUMQorCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgY2xhc3MgY29tcHJlc3NlZF9wYWlyX2ltcDxUMSwgVDIsIDE+CisgICAgICA6IHByb3RlY3RlZCA6OmJvb3N0OjpyZW1vdmVfY3Y8VDE+Ojp0eXBlCisgICB7CisgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICAgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoKSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogZmlyc3RfdHlwZSh4KSwgc2Vjb25kXyh5KSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCkKKyAgICAgICAgIDogZmlyc3RfdHlwZSh4KSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKHNlY29uZF9wYXJhbV90eXBlIHkpCisgICAgICAgICA6IHNlY29uZF8oeSkge30KKworICAgICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiAqdGhpczt9CisgICAgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7cmV0dXJuICp0aGlzO30KKworICAgICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7cmV0dXJuIHNlY29uZF87fQorICAgICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7cmV0dXJuIHNlY29uZF87fQorCisgICAgICB2b2lkIHN3YXAoOjpib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiYgeSkKKyAgICAgIHsKKyAgICAgICAgIC8vIG5vIG5lZWQgdG8gc3dhcCBlbXB0eSBiYXNlIGNsYXNzOgorICAgICAgICAgY3Bfc3dhcChzZWNvbmRfLCB5LnNlY29uZCgpKTsKKyAgICAgIH0KKyAgIHByaXZhdGU6CisgICAgICBzZWNvbmRfdHlwZSBzZWNvbmRfOworICAgfTsKKworICAgLy8gMiAgICBkZXJpdmUgZnJvbSBUMgorCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgY2xhc3MgY29tcHJlc3NlZF9wYWlyX2ltcDxUMSwgVDIsIDI+CisgICAgICA6IHByb3RlY3RlZCA6OmJvb3N0OjpyZW1vdmVfY3Y8VDI+Ojp0eXBlCisgICB7CisgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICAgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoKSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogc2Vjb25kX3R5cGUoeSksIGZpcnN0Xyh4KSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCkKKyAgICAgICAgIDogZmlyc3RfKHgpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogc2Vjb25kX3R5cGUoeSkge30KKworICAgICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiBmaXJzdF87fQorICAgICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3Qge3JldHVybiBmaXJzdF87fQorCisgICAgICBzZWNvbmRfcmVmZXJlbmNlICAgICAgIHNlY29uZCgpICAgICAgIHtyZXR1cm4gKnRoaXM7fQorICAgICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7cmV0dXJuICp0aGlzO30KKworICAgICAgdm9pZCBzd2FwKDo6Ym9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mIHkpCisgICAgICB7CisgICAgICAgICAvLyBubyBuZWVkIHRvIHN3YXAgZW1wdHkgYmFzZSBjbGFzczoKKyAgICAgICAgIGNwX3N3YXAoZmlyc3RfLCB5LmZpcnN0KCkpOworICAgICAgfQorCisgICBwcml2YXRlOgorICAgICAgZmlyc3RfdHlwZSBmaXJzdF87CisgICB9OworCisgICAvLyAzICAgIGRlcml2ZSBmcm9tIFQxIGFuZCBUMgorCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgY2xhc3MgY29tcHJlc3NlZF9wYWlyX2ltcDxUMSwgVDIsIDM+CisgICAgICA6IHByb3RlY3RlZCA6OmJvb3N0OjpyZW1vdmVfY3Y8VDE+Ojp0eXBlLAorICAgICAgICBwcm90ZWN0ZWQgOjpib29zdDo6cmVtb3ZlX2N2PFQyPjo6dHlwZQorICAgeworICAgcHVibGljOgorICAgICAgdHlwZWRlZiBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlOworICAgICAgdHlwZWRlZiBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpwYXJhbV90eXBlICAgICAgc2Vjb25kX3BhcmFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpyZWZlcmVuY2UgICAgICAgIGZpcnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpyZWZlcmVuY2UgICAgICAgc2Vjb25kX3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSAgZmlyc3RfY29uc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSBzZWNvbmRfY29uc3RfcmVmZXJlbmNlOworCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKCkge30KKworICAgICAgY29tcHJlc3NlZF9wYWlyX2ltcChmaXJzdF9wYXJhbV90eXBlIHgsIHNlY29uZF9wYXJhbV90eXBlIHkpCisgICAgICAgICA6IGZpcnN0X3R5cGUoeCksIHNlY29uZF90eXBlKHkpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoZmlyc3RfcGFyYW1fdHlwZSB4KQorICAgICAgICAgOiBmaXJzdF90eXBlKHgpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogc2Vjb25kX3R5cGUoeSkge30KKworICAgICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiAqdGhpczt9CisgICAgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7cmV0dXJuICp0aGlzO30KKworICAgICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7cmV0dXJuICp0aGlzO30KKyAgICAgIHNlY29uZF9jb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3Qge3JldHVybiAqdGhpczt9CisgICAgICAvLworICAgICAgLy8gbm8gbmVlZCB0byBzd2FwIGVtcHR5IGJhc2VzOgorICAgICAgdm9pZCBzd2FwKDo6Ym9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mKSB7fQorICAgfTsKKworICAgLy8gSk0KKyAgIC8vIDQgICAgVDEgPT0gVDIsIFQxIGFuZCBUMiBib3RoIGVtcHR5CisgICAvLyAgICAgIE9yaWdpbmFsbHkgdGhpcyBkaWQgbm90IHN0b3JlIGFuIGluc3RhbmNlIG9mIFQyIGF0IGFsbAorICAgLy8gICAgICBidXQgdGhhdCBsZWQgdG8gcHJvYmxlbXMgYmVhdXNlIGl0IG1lYW50ICZ4LmZpcnN0KCkgPT0gJnguc2Vjb25kKCkKKyAgIC8vICAgICAgd2hpY2ggaXMgbm90IHRydWUgZm9yIGFueSBvdGhlciBraW5kIG9mIHBhaXIsIHNvIG5vdyB3ZSBzdG9yZSBhbiBpbnN0YW5jZQorICAgLy8gICAgICBvZiBUMiBqdXN0IGluIGNhc2UgdGhlIHVzZXIgaXMgcmVseWluZyBvbiBmaXJzdCgpIGFuZCBzZWNvbmQoKSByZXR1cm5pbmcKKyAgIC8vICAgICAgZGlmZmVyZW50IG9iamVjdHMgKGFsYmVpdCBib3RoIGVtcHR5KS4KKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBjbGFzcyBjb21wcmVzc2VkX3BhaXJfaW1wPFQxLCBUMiwgND4KKyAgICAgIDogcHJvdGVjdGVkIDo6Ym9vc3Q6OnJlbW92ZV9jdjxUMT46OnR5cGUKKyAgIHsKKyAgIHB1YmxpYzoKKyAgICAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgICAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgY29tcHJlc3NlZF9wYWlyX2ltcCgpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KQorICAgICAgICAgOiBmaXJzdF90eXBlKHgpLCBtX3NlY29uZCh5KSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCkKKyAgICAgICAgIDogZmlyc3RfdHlwZSh4KSwgbV9zZWNvbmQoeCkge30KKworICAgICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiAqdGhpczt9CisgICAgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7cmV0dXJuICp0aGlzO30KKworICAgICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7cmV0dXJuIG1fc2Vjb25kO30KKyAgICAgIHNlY29uZF9jb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3Qge3JldHVybiBtX3NlY29uZDt9CisKKyAgICAgIHZvaWQgc3dhcCg6OmJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+Jikge30KKyAgIHByaXZhdGU6CisgICAgICBUMiBtX3NlY29uZDsKKyAgIH07CisKKyAgIC8vIDUgICAgVDEgPT0gVDIgYW5kIGFyZSBub3QgZW1wdHk6ICAgLy9KTQorCisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgY2xhc3MgY29tcHJlc3NlZF9wYWlyX2ltcDxUMSwgVDIsIDU+CisgICB7CisgICBwdWJsaWM6CisgICAgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICAgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgICAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICAgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoKSB7fQorCisgICAgICBjb21wcmVzc2VkX3BhaXJfaW1wKGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkKKyAgICAgICAgIDogZmlyc3RfKHgpLCBzZWNvbmRfKHkpIHt9CisKKyAgICAgIGNvbXByZXNzZWRfcGFpcl9pbXAoZmlyc3RfcGFyYW1fdHlwZSB4KQorICAgICAgICAgOiBmaXJzdF8oeCksIHNlY29uZF8oeCkge30KKworICAgICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiBmaXJzdF87fQorICAgICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3Qge3JldHVybiBmaXJzdF87fQorCisgICAgICBzZWNvbmRfcmVmZXJlbmNlICAgICAgIHNlY29uZCgpICAgICAgIHtyZXR1cm4gc2Vjb25kXzt9CisgICAgICBzZWNvbmRfY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0IHtyZXR1cm4gc2Vjb25kXzt9CisKKyAgICAgIHZvaWQgc3dhcCg6OmJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsIFQyPiYgeSkKKyAgICAgIHsKKyAgICAgICAgIGNwX3N3YXAoZmlyc3RfLCB5LmZpcnN0KCkpOworICAgICAgICAgY3Bfc3dhcChzZWNvbmRfLCB5LnNlY29uZCgpKTsKKyAgICAgIH0KKyAgIHByaXZhdGU6CisgICAgICBmaXJzdF90eXBlIGZpcnN0XzsKKyAgICAgIHNlY29uZF90eXBlIHNlY29uZF87CisgICB9OworCit9ICAvLyBkZXRhaWxzCisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitjbGFzcyBjb21wcmVzc2VkX3BhaXIKKyAgIDogcHJpdmF0ZSA6OmJvb3N0OjpkZXRhaWxzOjpjb21wcmVzc2VkX3BhaXJfaW1wPFQxLCBUMiwKKyAgICAgICAgICAgICA6OmJvb3N0OjpkZXRhaWxzOjpjb21wcmVzc2VkX3BhaXJfc3dpdGNoPAorICAgICAgICAgICAgICAgICAgICBUMSwKKyAgICAgICAgICAgICAgICAgICAgVDIsCisgICAgICAgICAgICAgICAgICAgIDo6Ym9vc3Q6OmlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2N2PFQxPjo6dHlwZSwgdHlwZW5hbWUgcmVtb3ZlX2N2PFQyPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUMT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUMj46OnZhbHVlPjo6dmFsdWU+Cit7Citwcml2YXRlOgorICAgdHlwZWRlZiBkZXRhaWxzOjpjb21wcmVzc2VkX3BhaXJfaW1wPFQxLCBUMiwKKyAgICAgICAgICAgICA6OmJvb3N0OjpkZXRhaWxzOjpjb21wcmVzc2VkX3BhaXJfc3dpdGNoPAorICAgICAgICAgICAgICAgICAgICBUMSwKKyAgICAgICAgICAgICAgICAgICAgVDIsCisgICAgICAgICAgICAgICAgICAgIDo6Ym9vc3Q6OmlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2N2PFQxPjo6dHlwZSwgdHlwZW5hbWUgcmVtb3ZlX2N2PFQyPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUMT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUMj46OnZhbHVlPjo6dmFsdWU+IGJhc2U7CitwdWJsaWM6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcigpIDogYmFzZSgpIHt9CisgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXIoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IGJhc2UoeCwgeSkge30KKyAgIGV4cGxpY2l0IGNvbXByZXNzZWRfcGFpcihmaXJzdF9wYXJhbV90eXBlIHgpIDogYmFzZSh4KSB7fQorICAgZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyKHNlY29uZF9wYXJhbV90eXBlIHkpIDogYmFzZSh5KSB7fQorCisgICBmaXJzdF9yZWZlcmVuY2UgICAgICAgZmlyc3QoKSAgICAgICB7cmV0dXJuIGJhc2U6OmZpcnN0KCk7fQorICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3Qge3JldHVybiBiYXNlOjpmaXJzdCgpO30KKworICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7cmV0dXJuIGJhc2U6OnNlY29uZCgpO30KKyAgIHNlY29uZF9jb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3Qge3JldHVybiBiYXNlOjpzZWNvbmQoKTt9CisKKyAgIHZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXImIHkpIHsgYmFzZTo6c3dhcCh5KTsgfQorfTsKKworLy8gSk0KKy8vIFBhcnRpYWwgc3BlY2lhbGlzYXRpb24gZm9yIGNhc2Ugd2hlcmUgVDEgPT0gVDI6CisvLwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBjb21wcmVzc2VkX3BhaXI8VCwgVD4KKyAgIDogcHJpdmF0ZSBkZXRhaWxzOjpjb21wcmVzc2VkX3BhaXJfaW1wPFQsIFQsCisgICAgICAgICAgICAgOjpib29zdDo6ZGV0YWlsczo6Y29tcHJlc3NlZF9wYWlyX3N3aXRjaDwKKyAgICAgICAgICAgICAgICAgICAgVCwKKyAgICAgICAgICAgICAgICAgICAgVCwKKyAgICAgICAgICAgICAgICAgICAgOjpib29zdDo6aXNfc2FtZTx0eXBlbmFtZSByZW1vdmVfY3Y8VD46OnR5cGUsIHR5cGVuYW1lIHJlbW92ZV9jdjxUPjo6dHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgIDo6Ym9vc3Q6OmlzX2VtcHR5PFQ+Ojp2YWx1ZT46OnZhbHVlPgoreworcHJpdmF0ZToKKyAgIHR5cGVkZWYgZGV0YWlsczo6Y29tcHJlc3NlZF9wYWlyX2ltcDxULCBULAorICAgICAgICAgICAgIDo6Ym9vc3Q6OmRldGFpbHM6OmNvbXByZXNzZWRfcGFpcl9zd2l0Y2g8CisgICAgICAgICAgICAgICAgICAgIFQsCisgICAgICAgICAgICAgICAgICAgIFQsCisgICAgICAgICAgICAgICAgICAgIDo6Ym9vc3Q6OmlzX3NhbWU8dHlwZW5hbWUgcmVtb3ZlX2N2PFQ+Ojp0eXBlLCB0eXBlbmFtZSByZW1vdmVfY3Y8VD46OnR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgOjpib29zdDo6aXNfZW1wdHk8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICA6OmJvb3N0Ojppc19lbXB0eTxUPjo6dmFsdWU+Ojp2YWx1ZT4gYmFzZTsKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyKCkgOiBiYXNlKCkge30KKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcihmaXJzdF9wYXJhbV90eXBlIHgsIHNlY29uZF9wYXJhbV90eXBlIHkpIDogYmFzZSh4LCB5KSB7fQorI2lmICEoZGVmaW5lZChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDw9IDB4NTMwKSkKKyAgIGV4cGxpY2l0IAorI2VuZGlmCisgICAgICBjb21wcmVzc2VkX3BhaXIoZmlyc3RfcGFyYW1fdHlwZSB4KSA6IGJhc2UoeCkge30KKworICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAge3JldHVybiBiYXNlOjpmaXJzdCgpO30KKyAgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZSBmaXJzdCgpIGNvbnN0IHtyZXR1cm4gYmFzZTo6Zmlyc3QoKTt9CisKKyAgIHNlY29uZF9yZWZlcmVuY2UgICAgICAgc2Vjb25kKCkgICAgICAge3JldHVybiBiYXNlOjpzZWNvbmQoKTt9CisgICBzZWNvbmRfY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0IHtyZXR1cm4gYmFzZTo6c2Vjb25kKCk7fQorCisgICB2b2lkIHN3YXAoOjpib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQsVD4mIHkpIHsgYmFzZTo6c3dhcCh5KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK2lubGluZQordm9pZAorc3dhcChjb21wcmVzc2VkX3BhaXI8VDEsIFQyPiYgeCwgY29tcHJlc3NlZF9wYWlyPFQxLCBUMj4mIHkpCit7CisgICB4LnN3YXAoeSk7Cit9CisKK30gLy8gYm9vc3QKKworI2lmZGVmIEJPT1NUX01TVkMKKyMgcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIAorCisjZW5kaWYgLy8gQk9PU1RfREVUQUlMX0NPTVBSRVNTRURfUEFJUl9IUFAKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC9kZXRhaWwvb2JfY29tcHJlc3NlZF9wYWlyLmhwcCBiL2luY2x1ZGUvYm9vc3QvZGV0YWlsL29iX2NvbXByZXNzZWRfcGFpci5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2ZTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvZGV0YWlsL29iX2NvbXByZXNzZWRfcGFpci5ocHAKQEAgLTAsMCArMSw0OTkgQEAKKy8vICAoQykgQ29weXJpZ2h0IFN0ZXZlIENsZWFyeSwgQmVtYW4gRGF3ZXMsIEhvd2FyZCBIaW5uYW50ICYgSm9obiBNYWRkb2NrIDIwMDAuCisvLyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwKKy8vICBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkuCisvLworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkgZm9yIG1vc3QgcmVjZW50IHZlcnNpb24gaW5jbHVkaW5nIGRvY3VtZW50YXRpb24uCisvLyAgc2VlIGxpYnMvdXRpbGl0eS9jb21wcmVzc2VkX3BhaXIuaHBwCisvLworLyogUmVsZWFzZSBub3RlczoKKyAgIDIwIEphbiAyMDAxOgorICAgICAgICBGaXhlZCBvYnZpb3VzIGJ1Z3MgKERhdmlkIEFicmFoYW1zKQorICAgMDcgT2N0IDIwMDA6CisgICAgICBBZGRlZCBiZXR0ZXIgc2luZ2xlIGFyZ3VtZW50IGNvbnN0cnVjdG9yIHN1cHBvcnQuCisgICAwMyBPY3QgMjAwMDoKKyAgICAgIEFkZGVkIFZDNiBzdXBwb3J0IChKTSkuCisgICAyM3JkIEp1bHkgMjAwMDoKKyAgICAgIEFkZGl0aW9uYWwgY29tbWVudHMgYWRkZWQuIChKTSkKKyAgIEphbiAyMDAwOgorICAgICAgT3JpZ2luYWwgdmVyc2lvbjogdGhpcyB2ZXJzaW9uIGNyaXBwbGVkIGZvciB1c2Ugd2l0aCBjcmlwcGxlZCBjb21waWxlcnMKKyAgICAgIC0gSm9obiBNYWRkb2NrIEphbiAyMDAwLgorKi8KKworCisjaWZuZGVmIEJPT1NUX09CX0NPTVBSRVNTRURfUEFJUl9IUFAKKyNkZWZpbmUgQk9PU1RfT0JfQ09NUFJFU1NFRF9QQUlSX0hQUAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2lmbmRlZiBCT09TVF9PQkpFQ1RfVFlQRV9UUkFJVFNfSFBQCisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvb2JqZWN0X3RyYWl0cy5ocHA+CisjZW5kaWYKKyNpZm5kZWYgQk9PU1RfU0FNRV9UUkFJVFNfSFBQCisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvc2FtZV90cmFpdHMuaHBwPgorI2VuZGlmCisjaWZuZGVmIEJPT1NUX0NBTExfVFJBSVRTX0hQUAorI2luY2x1ZGUgPGJvb3N0L2NhbGxfdHJhaXRzLmhwcD4KKyNlbmRpZgorCituYW1lc3BhY2UgYm9vc3QKK3sKKyNpZmRlZiBCT09TVF9NU1ZDNl9NRU1CRVJfVEVNUExBVEVTCisvLworLy8gdXNlIG1lbWJlciB0ZW1wbGF0ZXMgdG8gZW11bGF0ZQorLy8gcGFydGlhbCBzcGVjaWFsaXNhdGlvbi4gIE5vdGUgdGhhdCBkdWUgdG8KKy8vIHByb2JsZW1zIHdpdGggb3ZlcmxvYWQgcmVzb2x1dGlvbiB3aXRoIFZDNgorLy8gZWFjaCBvZiB0aGUgY29tcHJlc3NlZF9wYWlyIHZlcnNpb25zIHRoYXQgZm9sbG93CisvLyBoYXZlIG9uZSB0ZW1wbGF0ZSBzaW5nbGUtYXJndW1lbnQgY29uc3RydWN0b3IKKy8vIGluIHBsYWNlIG9mIHR3byBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6CisvLworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyOworCituYW1lc3BhY2UgZGV0YWlseworCit0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgVDEsIGNsYXNzIFQyPgorc3RydWN0IGJlc3RfY29udmVyc2lvbl90cmFpdHMKK3sKKyAgIHR5cGVkZWYgY2hhciBvbmU7CisgICB0eXBlZGVmIGNoYXIgKCZ0d28pWzJdOworICAgc3RhdGljIEEgYTsKKyAgIHN0YXRpYyBvbmUgdGVzdChUMSk7CisgICBzdGF0aWMgdHdvIHRlc3QoVDIpOworCisgICBlbnVtIHsgdmFsdWUgPSBzaXplb2YodGVzdChhKSkgfTsKK307CisKK3RlbXBsYXRlIDxpbnQ+CitzdHJ1Y3QgaW5pdF9vbmU7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaW5pdF9vbmU8MT4KK3sKKyAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBzdGF0aWMgdm9pZCBpbml0KGNvbnN0IEEmIGEsIFQxKiBwMSwgVDIqKQorICAgeworICAgICAgKnAxID0gYTsKKyAgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaW5pdF9vbmU8Mj4KK3sKKyAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBzdGF0aWMgdm9pZCBpbml0KGNvbnN0IEEmIGEsIFQxKiwgVDIqIHAyKQorICAgeworICAgICAgKnAyID0gYTsKKyAgIH0KK307CisKKworLy8gVDEgIT0gVDIsIGJvdGggbm9uLWVtcHR5Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyXzAKK3sKK3ByaXZhdGU6CisgICBUMSBfZmlyc3Q7CisgICBUMiBfc2Vjb25kOworcHVibGljOgorICAgdHlwZWRlZiBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlOworICAgdHlwZWRlZiBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpwYXJhbV90eXBlICAgICAgc2Vjb25kX3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpyZWZlcmVuY2UgICAgICAgIGZpcnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpyZWZlcmVuY2UgICAgICAgc2Vjb25kX3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSAgZmlyc3RfY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSBzZWNvbmRfY29uc3RfcmVmZXJlbmNlOworCisgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXJfMCgpIDogX2ZpcnN0KCksIF9zZWNvbmQoKSB7fQorICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzAoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IF9maXJzdCh4KSwgX3NlY29uZCh5KSB7fQorICAgdGVtcGxhdGUgPGNsYXNzIEE+CisgICBleHBsaWNpdCBjb21wcmVzc2VkX3BhaXJfMChjb25zdCBBJiB2YWwpCisgICB7CisgICAgICBpbml0X29uZTxiZXN0X2NvbnZlcnNpb25fdHJhaXRzPEEsIFQxLCBUMj46OnZhbHVlPjo6aW5pdCh2YWwsICZfZmlyc3QsICZfc2Vjb25kKTsKKyAgIH0KKyAgIGNvbXByZXNzZWRfcGFpcl8wKGNvbnN0IDo6Ym9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mIHgpCisgICAgICA6IF9maXJzdCh4LmZpcnN0KCkpLCBfc2Vjb25kKHguc2Vjb25kKCkpIHt9CisKKyNpZiAwCisgIGNvbXByZXNzZWRfcGFpcl8wJiBvcGVyYXRvcj0oY29uc3QgY29tcHJlc3NlZF9wYWlyXzAmIHgpIHsKKyAgICBjb3V0IDw8ICJhc3NpZ25pbmcgY29tcHJlc3NlZCBwYWlyIDAiIDw8IGVuZGw7CisgICAgX2ZpcnN0ID0geC5fZmlyc3Q7CisgICAgX3NlY29uZCA9IHguX3NlY29uZDsKKyAgICBjb3V0IDw8ICJmaW5pc2hlZCBhc3NpZ25pbmcgY29tcHJlc3NlZCBwYWlyIDAiIDw8IGVuZGw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKworICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAgeyByZXR1cm4gX2ZpcnN0OyB9CisgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7IHJldHVybiBfZmlyc3Q7IH0KKworICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7IHJldHVybiBfc2Vjb25kOyB9CisgICBzZWNvbmRfY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0IHsgcmV0dXJuIF9zZWNvbmQ7IH0KKworICAgdm9pZCBzd2FwKGNvbXByZXNzZWRfcGFpcl8wJiB5KQorICAgeworICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgc3dhcChfZmlyc3QsIHkuX2ZpcnN0KTsKKyAgICAgIHN3YXAoX3NlY29uZCwgeS5fc2Vjb25kKTsKKyAgIH0KK307CisKKy8vIFQxICE9IFQyLCBUMiBlbXB0eQordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK2NsYXNzIGNvbXByZXNzZWRfcGFpcl8xIDogVDIKK3sKK3ByaXZhdGU6CisgICBUMSBfZmlyc3Q7CitwdWJsaWM6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcl8xKCkgOiBUMigpLCBfZmlyc3QoKSB7fQorICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzEoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IFQyKHkpLCBfZmlyc3QoeCkge30KKworICAgdGVtcGxhdGUgPGNsYXNzIEE+CisgICBleHBsaWNpdCBjb21wcmVzc2VkX3BhaXJfMShjb25zdCBBJiB2YWwpCisgICB7CisgICAgICBpbml0X29uZTxiZXN0X2NvbnZlcnNpb25fdHJhaXRzPEEsIFQxLCBUMj46OnZhbHVlPjo6aW5pdCh2YWwsICZfZmlyc3QsIHN0YXRpY19jYXN0PFQyKj4odGhpcykpOworICAgfQorCisgICBjb21wcmVzc2VkX3BhaXJfMShjb25zdCA6OmJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+JiB4KQorICAgICAgOiBUMih4LnNlY29uZCgpKSwgX2ZpcnN0KHguZmlyc3QoKSkge30KKworICAgZmlyc3RfcmVmZXJlbmNlICAgICAgIGZpcnN0KCkgICAgICAgeyByZXR1cm4gX2ZpcnN0OyB9CisgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7IHJldHVybiBfZmlyc3Q7IH0KKworICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICB2b2lkIHN3YXAoY29tcHJlc3NlZF9wYWlyXzEmIHkpCisgICB7CisgICAgICAvLyBubyBuZWVkIHRvIHN3YXAgZW1wdHkgYmFzZSBjbGFzczoKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAoX2ZpcnN0LCB5Ll9maXJzdCk7CisgICB9Cit9OworCisvLyBUMSAhPSBUMiwgVDEgZW1wdHkKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitjbGFzcyBjb21wcmVzc2VkX3BhaXJfMiA6IFQxCit7Citwcml2YXRlOgorICAgVDIgX3NlY29uZDsKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzIoKSA6IFQxKCksIF9zZWNvbmQoKSB7fQorICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzIoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IFQxKHgpLCBfc2Vjb25kKHkpIHt9CisgICB0ZW1wbGF0ZSA8Y2xhc3MgQT4KKyAgIGV4cGxpY2l0IGNvbXByZXNzZWRfcGFpcl8yKGNvbnN0IEEmIHZhbCkKKyAgIHsKKyAgICAgIGluaXRfb25lPGJlc3RfY29udmVyc2lvbl90cmFpdHM8QSwgVDEsIFQyPjo6dmFsdWU+Ojppbml0KHZhbCwgc3RhdGljX2Nhc3Q8VDEqPih0aGlzKSwgJl9zZWNvbmQpOworICAgfQorICAgY29tcHJlc3NlZF9wYWlyXzIoY29uc3QgOjpib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiYgeCkKKyAgICAgIDogVDEoeC5maXJzdCgpKSwgX3NlY29uZCh4LnNlY29uZCgpKSB7fQorCisjaWYgMAorICBjb21wcmVzc2VkX3BhaXJfMiYgb3BlcmF0b3I9KGNvbnN0IGNvbXByZXNzZWRfcGFpcl8yJiB4KSB7CisgICAgY291dCA8PCAiYXNzaWduaW5nIGNvbXByZXNzZWQgcGFpciAyIiA8PCBlbmRsOworICAgIFQxOjpvcGVyYXRvcj0oeCk7CisgICAgX3NlY29uZCA9IHguX3NlY29uZDsKKyAgICBjb3V0IDw8ICJmaW5pc2hlZCBhc3NpZ25pbmcgY29tcHJlc3NlZCBwYWlyIDIiIDw8IGVuZGw7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZW5kaWYKKyAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICBzZWNvbmRfcmVmZXJlbmNlICAgICAgIHNlY29uZCgpICAgICAgIHsgcmV0dXJuIF9zZWNvbmQ7IH0KKyAgIHNlY29uZF9jb25zdF9yZWZlcmVuY2Ugc2Vjb25kKCkgY29uc3QgeyByZXR1cm4gX3NlY29uZDsgfQorCisgICB2b2lkIHN3YXAoY29tcHJlc3NlZF9wYWlyXzImIHkpCisgICB7CisgICAgICAvLyBubyBuZWVkIHRvIHN3YXAgZW1wdHkgYmFzZSBjbGFzczoKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAoX3NlY29uZCwgeS5fc2Vjb25kKTsKKyAgIH0KK307CisKKy8vIFQxICE9IFQyLCBib3RoIGVtcHR5Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyXzMgOiBUMSwgVDIKK3sKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzMoKSA6IFQxKCksIFQyKCkge30KKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcl8zKGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkgOiBUMSh4KSwgVDIoeSkge30KKyAgIHRlbXBsYXRlIDxjbGFzcyBBPgorICAgZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyXzMoY29uc3QgQSYgdmFsKQorICAgeworICAgICAgaW5pdF9vbmU8YmVzdF9jb252ZXJzaW9uX3RyYWl0czxBLCBUMSwgVDI+Ojp2YWx1ZT46OmluaXQodmFsLCBzdGF0aWNfY2FzdDxUMSo+KHRoaXMpLCBzdGF0aWNfY2FzdDxUMio+KHRoaXMpKTsKKyAgIH0KKyAgIGNvbXByZXNzZWRfcGFpcl8zKGNvbnN0IDo6Ym9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mIHgpCisgICAgICA6IFQxKHguZmlyc3QoKSksIFQyKHguc2Vjb25kKCkpIHt9CisKKyAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICBmaXJzdF9jb25zdF9yZWZlcmVuY2UgZmlyc3QoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgICBzZWNvbmRfcmVmZXJlbmNlICAgICAgIHNlY29uZCgpICAgICAgIHsgcmV0dXJuICp0aGlzOyB9CisgICBzZWNvbmRfY29uc3RfcmVmZXJlbmNlIHNlY29uZCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgIHZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXJfMyYgeSkKKyAgIHsKKyAgICAgIC8vIG5vIG5lZWQgdG8gc3dhcCBlbXB0eSBiYXNlIGNsYXNzZXM6CisgICB9Cit9OworCisvLyBUMSA9PSBUMiwgYW5kIGVtcHR5Cit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyXzQgOiBUMQoreworcHVibGljOgorICAgdHlwZWRlZiBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlOworICAgdHlwZWRlZiBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpwYXJhbV90eXBlICAgICAgc2Vjb25kX3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpyZWZlcmVuY2UgICAgICAgIGZpcnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpyZWZlcmVuY2UgICAgICAgc2Vjb25kX3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSAgZmlyc3RfY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSBzZWNvbmRfY29uc3RfcmVmZXJlbmNlOworCisgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXJfNCgpIDogVDEoKSB7fQorICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzQoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IFQxKHgpLCBtX3NlY29uZCh5KSB7fQorICAgLy8gb25seSBvbmUgc2luZ2xlIGFyZ3VtZW50IGNvbnN0cnVjdG9yIHNpbmNlIFQxID09IFQyCisgICBleHBsaWNpdCBjb21wcmVzc2VkX3BhaXJfNChmaXJzdF9wYXJhbV90eXBlIHgpIDogVDEoeCksIG1fc2Vjb25kKHgpIHt9CisgICBjb21wcmVzc2VkX3BhaXJfNChjb25zdCA6OmJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+JiB4KQorICAgICAgOiBUMSh4LmZpcnN0KCkpLCBtX3NlY29uZCh4LnNlY29uZCgpKSB7fQorCisgICBmaXJzdF9yZWZlcmVuY2UgICAgICAgZmlyc3QoKSAgICAgICB7IHJldHVybiAqdGhpczsgfQorICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICAgc2Vjb25kX3JlZmVyZW5jZSAgICAgICBzZWNvbmQoKSAgICAgICB7IHJldHVybiBtX3NlY29uZDsgfQorICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7IHJldHVybiBtX3NlY29uZDsgfQorCisgICB2b2lkIHN3YXAoY29tcHJlc3NlZF9wYWlyXzQmIHkpCisgICB7CisgICAgICAvLyBubyBuZWVkIHRvIHN3YXAgZW1wdHkgYmFzZSBjbGFzc2VzOgorICAgfQorcHJpdmF0ZToKKyAgIFQyIG1fc2Vjb25kOworfTsKKworLy8gVDEgPT0gVDIsIG5vdCBlbXB0eQordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK2NsYXNzIGNvbXByZXNzZWRfcGFpcl81Cit7Citwcml2YXRlOgorICAgVDEgX2ZpcnN0OworICAgVDIgX3NlY29uZDsKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyXzUoKSA6IF9maXJzdCgpLCBfc2Vjb25kKCkge30KKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcl81KGZpcnN0X3BhcmFtX3R5cGUgeCwgc2Vjb25kX3BhcmFtX3R5cGUgeSkgOiBfZmlyc3QoeCksIF9zZWNvbmQoeSkge30KKyAgIC8vIG9ubHkgb25lIHNpbmdsZSBhcmd1bWVudCBjb25zdHJ1Y3RvciBzaW5jZSBUMSA9PSBUMgorICAgZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyXzUoZmlyc3RfcGFyYW1fdHlwZSB4KSA6IF9maXJzdCh4KSwgX3NlY29uZCh4KSB7fQorICAgY29tcHJlc3NlZF9wYWlyXzUoY29uc3QgOjpib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiYgYykgCisgICAgICA6IF9maXJzdChjLmZpcnN0KCkpLCBfc2Vjb25kKGMuc2Vjb25kKCkpIHt9CisKKyAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHsgcmV0dXJuIF9maXJzdDsgfQorICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QgeyByZXR1cm4gX2ZpcnN0OyB9CisKKyAgIHNlY29uZF9yZWZlcmVuY2UgICAgICAgc2Vjb25kKCkgICAgICAgeyByZXR1cm4gX3NlY29uZDsgfQorICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7IHJldHVybiBfc2Vjb25kOyB9CisKKyAgIHZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXJfNSYgeSkKKyAgIHsKKyAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgIHN3YXAoX2ZpcnN0LCB5Ll9maXJzdCk7CisgICAgICBzd2FwKF9zZWNvbmQsIHkuX3NlY29uZCk7CisgICB9Cit9OworCit0ZW1wbGF0ZSA8Ym9vbCBlMSwgYm9vbCBlMiwgYm9vbCBzYW1lPgorc3RydWN0IGNvbXByZXNzZWRfcGFpcl9jaG9vc2VyCit7CisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IHJlYmluZAorICAgeworICAgICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfMDxUMSwgVDI+IHR5cGU7CisgICB9OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfY2hvb3NlcjxmYWxzZSwgdHJ1ZSwgZmFsc2U+Cit7CisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IHJlYmluZAorICAgeworICAgICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfMTxUMSwgVDI+IHR5cGU7CisgICB9OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfY2hvb3Nlcjx0cnVlLCBmYWxzZSwgZmFsc2U+Cit7CisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IHJlYmluZAorICAgeworICAgICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfMjxUMSwgVDI+IHR5cGU7CisgICB9OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfY2hvb3Nlcjx0cnVlLCB0cnVlLCBmYWxzZT4KK3sKKyAgIHRlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CisgICBzdHJ1Y3QgcmViaW5kCisgICB7CisgICAgICB0eXBlZGVmIGNvbXByZXNzZWRfcGFpcl8zPFQxLCBUMj4gdHlwZTsKKyAgIH07Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGNvbXByZXNzZWRfcGFpcl9jaG9vc2VyPHRydWUsIHRydWUsIHRydWU+Cit7CisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IHJlYmluZAorICAgeworICAgICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfNDxUMSwgVDI+IHR5cGU7CisgICB9OworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfY2hvb3NlcjxmYWxzZSwgZmFsc2UsIHRydWU+Cit7CisgICB0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorICAgc3RydWN0IHJlYmluZAorICAgeworICAgICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfNTxUMSwgVDI+IHR5cGU7CisgICB9OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfdHJhaXRzCit7Citwcml2YXRlOgorICAgdHlwZWRlZiBjb21wcmVzc2VkX3BhaXJfY2hvb3Nlcjxpc19lbXB0eTxUMT46OnZhbHVlLCBpc19lbXB0eTxUMj46OnZhbHVlLCBpc19zYW1lPFQxLFQyPjo6dmFsdWU+IGNob29zZXI7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNob29zZXI6OnRlbXBsYXRlIHJlYmluZDxUMSwgVDI+IGJvdW5kX3R5cGU7CitwdWJsaWM6CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvdW5kX3R5cGU6OnR5cGUgdHlwZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyIDogcHVibGljIGRldGFpbDo6Y29tcHJlc3NlZF9wYWlyX3RyYWl0czxUMSwgVDI+Ojp0eXBlCit7Citwcml2YXRlOgorICAgdHlwZWRlZiB0eXBlbmFtZSBkZXRhaWw6OmNvbXByZXNzZWRfcGFpcl90cmFpdHM8VDEsIFQyPjo6dHlwZSBiYXNlX3R5cGU7CitwdWJsaWM6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnJlZmVyZW5jZSAgICAgICAgZmlyc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnJlZmVyZW5jZSAgICAgICBzZWNvbmRfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlICBmaXJzdF9jb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6Y29uc3RfcmVmZXJlbmNlIHNlY29uZF9jb25zdF9yZWZlcmVuY2U7CisKKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcigpIDogYmFzZV90eXBlKCkge30KKyAgICAgICAgICAgIGNvbXByZXNzZWRfcGFpcihmaXJzdF9wYXJhbV90eXBlIHgsIHNlY29uZF9wYXJhbV90eXBlIHkpIDogYmFzZV90eXBlKHgsIHkpIHt9CisgICB0ZW1wbGF0ZSA8Y2xhc3MgQT4KKyAgIGV4cGxpY2l0IGNvbXByZXNzZWRfcGFpcihjb25zdCBBJiB4KSA6IGJhc2VfdHlwZSh4KXt9CisKKyAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHsgcmV0dXJuIGJhc2VfdHlwZTo6Zmlyc3QoKTsgfQorICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QgeyByZXR1cm4gYmFzZV90eXBlOjpmaXJzdCgpOyB9CisKKyAgIHNlY29uZF9yZWZlcmVuY2UgICAgICAgc2Vjb25kKCkgICAgICAgeyByZXR1cm4gYmFzZV90eXBlOjpzZWNvbmQoKTsgfQorICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7IHJldHVybiBiYXNlX3R5cGU6OnNlY29uZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgoraW5saW5lIHZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXI8VDEsIFQyPiYgeCwgY29tcHJlc3NlZF9wYWlyPFQxLCBUMj4mIHkpCit7CisgICB4LnN3YXAoeSk7Cit9CisKKyNlbHNlCisvLyBubyBwYXJ0aWFsIHNwZWNpYWxpc2F0aW9uLCBubyBtZW1iZXIgdGVtcGxhdGVzOgorCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorY2xhc3MgY29tcHJlc3NlZF9wYWlyCit7Citwcml2YXRlOgorICAgVDEgX2ZpcnN0OworICAgVDIgX3NlY29uZDsKK3B1YmxpYzoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cmVmZXJlbmNlICAgICAgICBmaXJzdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cmVmZXJlbmNlICAgICAgIHNlY29uZF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UgIGZpcnN0X2NvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2Ugc2Vjb25kX2NvbnN0X3JlZmVyZW5jZTsKKworICAgICAgICAgICAgY29tcHJlc3NlZF9wYWlyKCkgOiBfZmlyc3QoKSwgX3NlY29uZCgpIHt9CisgICAgICAgICAgICBjb21wcmVzc2VkX3BhaXIoZmlyc3RfcGFyYW1fdHlwZSB4LCBzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IF9maXJzdCh4KSwgX3NlY29uZCh5KSB7fQorICAgZXhwbGljaXQgY29tcHJlc3NlZF9wYWlyKGZpcnN0X3BhcmFtX3R5cGUgeCkgOiBfZmlyc3QoeCksIF9zZWNvbmQoKSB7fQorICAgLy8gY2FuJ3QgZGVmaW5lIHRoaXMgaW4gY2FzZSBUMSA9PSBUMjoKKyAgIC8vIGV4cGxpY2l0IGNvbXByZXNzZWRfcGFpcihzZWNvbmRfcGFyYW1fdHlwZSB5KSA6IF9maXJzdCgpLCBfc2Vjb25kKHkpIHt9CisKKyAgIGZpcnN0X3JlZmVyZW5jZSAgICAgICBmaXJzdCgpICAgICAgIHsgcmV0dXJuIF9maXJzdDsgfQorICAgZmlyc3RfY29uc3RfcmVmZXJlbmNlIGZpcnN0KCkgY29uc3QgeyByZXR1cm4gX2ZpcnN0OyB9CisKKyAgIHNlY29uZF9yZWZlcmVuY2UgICAgICAgc2Vjb25kKCkgICAgICAgeyByZXR1cm4gX3NlY29uZDsgfQorICAgc2Vjb25kX2NvbnN0X3JlZmVyZW5jZSBzZWNvbmQoKSBjb25zdCB7IHJldHVybiBfc2Vjb25kOyB9CisKKyAgIHZvaWQgc3dhcChjb21wcmVzc2VkX3BhaXImIHkpCisgICB7CisgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICBzd2FwKF9maXJzdCwgeS5fZmlyc3QpOworICAgICAgc3dhcChfc2Vjb25kLCB5Ll9zZWNvbmQpOworICAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK2lubGluZSB2b2lkIHN3YXAoY29tcHJlc3NlZF9wYWlyPFQxLCBUMj4mIHgsIGNvbXByZXNzZWRfcGFpcjxUMSwgVDI+JiB5KQoreworICAgeC5zd2FwKHkpOworfQorCisjZW5kaWYKKworfSAvLyBib29zdAorCisjZW5kaWYgLy8gQk9PU1RfT0JfQ09NUFJFU1NFRF9QQUlSX0hQUAorCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC9vcGVyYXRvcnMuaHBwIGIvaW5jbHVkZS9ib29zdC9vcGVyYXRvcnMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjU3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L29wZXJhdG9ycy5ocHAKQEAgLTAsMCArMSw5MTEgQEAKKy8vICBCb29zdCBvcGVyYXRvcnMuaHBwIGhlYWRlciBmaWxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gIChDKSBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMsIEplcmVteSBTaWVrLCBEYXJ5bGUgV2Fsa2VyIDE5OTktMjAwMS4KKy8vICAoQykgQ29weXJpZ2h0IERhbmllbCBGcmV5IDIwMDItMjAxNy4KKy8vICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vICBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvb3BlcmF0b3JzLmh0bSBmb3IgZG9jdW1lbnRhdGlvbi4KKworLy8gIFJldmlzaW9uIEhpc3RvcnkKKy8vICAyMyBOb3YgMTcgUHJvdGVjdCBkZXJlZmVyZW5jZWFibGU8PiBmcm9tIG92ZXJsb2FkZWQgb3BlcmF0b3ImLgorLy8gIDE1IE9jdCAxNyBBZGFwdGVkIHRvIEMrKzE3LCByZXBsYWNlIHN0ZDo6aXRlcmF0b3I8PiB3aXRoIG1hbnVhbAorLy8gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKy8vICAyMiBGZWIgMTYgQWRkZWQgQURMIHByb3RlY3Rpb24sIHByZXNlcnZlIG9sZCB3b3JrLWFyb3VuZHMgaW4KKy8vICAgICAgICAgICAgb3BlcmF0b3JzX3YxLmhwcCBhbmQgY2xlYW4gdXAgdGhpcyBmaWxlLiAoRGFuaWVsIEZyZXkpCisvLyAgMTYgRGVjIDEwIExpbWl0IHdhcm5pbmcgc3VwcHJlc3Npb24gZm9yIDQyODQgdG8gb2xkZXIgdmVyc2lvbnMgb2YgVkMrKworLy8gICAgICAgICAgICAoTWF0dGhldyBCcmFkYnVyeSwgZml4ZXMgIzQ0MzIpCisvLyAgMDcgQXVnIDA4IEFkZGVkICJldWNsaWRlYW4iIHNwZWxsaW5nLiAoRGFuaWVsIEZyZXkpCisvLyAgMDMgQXByIDA4IE1ha2Ugc3VyZSAiY29udmVydGlibGUgdG8gYm9vbCIgaXMgc3VmZmljaWVudAorLy8gICAgICAgICAgICBmb3IgVDo6b3BlcmF0b3I8LCBldGMuIChEYW5pZWwgRnJleSkKKy8vICAyNCBNYXkgMDcgQ2hhbmdlZCBlbXB0eV9iYXNlIHRvIGRlcGVuZCBvbiBULCBzZWUKKy8vICAgICAgICAgICAgaHR0cDovL3N2bi5ib29zdC5vcmcvdHJhYy9ib29zdC90aWNrZXQvOTc5CisvLyAgMjEgT2N0IDAyIE1vZGlmaWVkIGltcGxlbWVudGF0aW9uIG9mIG9wZXJhdG9ycyB0byBhbGxvdyBjb21waWxlcnMgd2l0aCBhCisvLyAgICAgICAgICAgIGNvcnJlY3QgbmFtZWQgcmV0dXJuIHZhbHVlIG9wdGltaXphdGlvbiAoTlJWTykgdG8gcHJvZHVjZSBvcHRpbWFsCisvLyAgICAgICAgICAgIGNvZGUuICAoRGFuaWVsIEZyZXkpCisvLyAgMDIgRGVjIDAxIEJ1ZyBmaXhlZCBpbiByYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUuICAoSGVsbXV0IFplaXNlbCkKKy8vICAyOCBTZXAgMDEgRmFjdG9yZWQgb3V0IGl0ZXJhdG9yIG9wZXJhdG9yIGdyb3Vwcy4gIChEYXJ5bGUgV2Fsa2VyKQorLy8gIDI3IEF1ZyAwMSAnbGVmdCcgZm9ybSBmb3Igbm9uIGNvbW11dGF0aXZlIG9wZXJhdG9ycyBhZGRlZDsKKy8vICAgICAgICAgICAgYWRkaXRpb25hbCBjbGFzc2VzIGZvciBncm91cHMgb2YgcmVsYXRlZCBvcGVyYXRvcnMgYWRkZWQ7CisvLyAgICAgICAgICAgIHdvcmthcm91bmQgZm9yIGVtcHR5IGJhc2UgY2xhc3Mgb3B0aW1pemF0aW9uCisvLyAgICAgICAgICAgIGJ1ZyBvZiBHQ0MgMy4wIChIZWxtdXQgWmVpc2VsKQorLy8gIDI1IEp1biAwMSBvdXRwdXRfaXRlcmF0b3JfaGVscGVyIGNoYW5nZXM6IHJlbW92ZWQgZGVmYXVsdCB0ZW1wbGF0ZQorLy8gICAgICAgICAgICBwYXJhbWV0ZXJzLCBhZGRlZCBzdXBwb3J0IGZvciBzZWxmLXByb3h5aW5nLCBhZGRpdGlvbmFsCisvLyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYW5kIHRlc3RzIChBbGVrc2V5IEd1cnRvdm95KQorLy8gIDI5IE1heSAwMSBBZGRlZCBvcGVyYXRvciBjbGFzc2VzIGZvciA8PCBhbmQgPj4uICBBZGRlZCBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgICAgICAgIGl0ZXJhdG9yIGhlbHBlciBjbGFzc2VzLiAgQWRkZWQgY2xhc3NlcyB0byBjb25uZWN0IGVxdWFsaXR5IGFuZAorLy8gICAgICAgICAgICByZWxhdGlvbmFsIG9wZXJhdG9ycy4gIEFkZGVkIGNsYXNzZXMgZm9yIGdyb3VwcyBvZiByZWxhdGVkCisvLyAgICAgICAgICAgIG9wZXJhdG9ycy4gIFJlaW1wbGVtZW50ZWQgZXhhbXBsZSBvcGVyYXRvciBhbmQgaXRlcmF0b3IgaGVscGVyCisvLyAgICAgICAgICAgIGNsYXNzZXMgaW4gdGVybXMgb2YgdGhlIG5ldyBncm91cHMuICAoRGFyeWxlIFdhbGtlciwgd2l0aCBoZWxwCisvLyAgICAgICAgICAgIGZyb20gQWxleHkgR3VydG92b3kpCisvLyAgMTEgRmViIDAxIEZpeGVkIGJ1Z3MgaW4gdGhlIGl0ZXJhdG9yIGhlbHBlcnMgd2hpY2ggcHJldmVudGVkIGV4cGxpY2l0bHkKKy8vICAgICAgICAgICAgc3VwcGxpZWQgYXJndW1lbnRzIGZyb20gYWN0dWFsbHkgYmVpbmcgdXNlZCAoRGF2ZSBBYnJhaGFtcykKKy8vICAwNCBKdWwgMDAgRml4ZWQgTk9fT1BFUkFUT1JTX0lOX05BTUVTUEFDRSBidWdzLCBtYWpvciBjbGVhbnVwIGFuZAorLy8gICAgICAgICAgICByZWZhY3RvcmluZyBvZiBjb21waWxlciB3b3JrYXJvdW5kcywgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uCisvLyAgICAgICAgICAgIChBbGV4eSBHdXJ0b3ZveSBhbmQgTWFyayBSb2RnZXJzIHdpdGggc29tZSBoZWxwIGFuZCBwcm9tcHRpbmcgZnJvbQorLy8gICAgICAgICAgICBEYXZlIEFicmFoYW1zKQorLy8gIDI4IEp1biAwMCBHZW5lcmFsIGNsZWFudXAgYW5kIGludGVncmF0aW9uIG9mIGJ1Z2ZpeGVzIGZyb20gTWFyayBSb2RnZXJzIGFuZAorLy8gICAgICAgICAgICBKZXJlbXkgU2llayAoRGF2ZSBBYnJhaGFtcykKKy8vICAyMCBKdW4gMDAgQ2hhbmdlcyB0byBhY2NvbW1vZGF0ZSBCb3JsYW5kIEMrK0J1aWxkZXIgNCBhbmQgQm9ybGFuZCBDKysgNS41CisvLyAgICAgICAgICAgIChNYXJrIFJvZGdlcnMpCisvLyAgMjAgSnVuIDAwIE1pbm9yIGZpeGVzIHRvIHRoZSBwcmlvciByZXZpc2lvbiAoQWxla3NleSBHdXJ0b3ZveSkKKy8vICAxMCBKdW4gMDAgU3VwcG9ydCBmb3IgdGhlIGJhc2UgY2xhc3MgY2hhaW5pbmcgdGVjaG5pcXVlIHdhcyBhZGRlZAorLy8gICAgICAgICAgICAoQWxla3NleSBHdXJ0b3ZveSkuIFNlZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgY29tbWVudHMgYmVsb3cKKy8vICAgICAgICAgICAgZm9yIHRoZSBkZXRhaWxzLgorLy8gIDEyIERlYyA5OSBJbml0aWFsIHZlcnNpb24gd2l0aCBpdGVyYXRvciBvcGVyYXRvcnMgKEplcmVteSBTaWVrKQorLy8gIDE4IE5vdiA5OSBDaGFuZ2UgbmFtZSAiZGl2aWRlYWJsZSIgdG8gImRpdmlkYWJsZSIsIHJlbW92ZSB1bm5lY2Vzc2FyeQorLy8gICAgICAgICAgICBzcGVjaWFsaXphdGlvbnMgb2YgZGl2aWRhYmxlLCBzdWJ0cmFjdGFibGUsIG1vZGFibGUgKEVkIEJyZXkpCisvLyAgMTcgTm92IDk5IEFkZCBjb21tZW50cyAoQmVtYW4gRGF3ZXMpCisvLyAgICAgICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSBzcGVjaWFsaXphdGlvbiBvZiBvcGVyYXRvcnM8PiAoRWQgQnJleSkKKy8vICAxNSBOb3YgOTkgRml4IGxlc3NfdGhhbl9jb21wYXJhYmxlPFQsVT4gc2Vjb25kIG9wZXJhbmQgdHlwZSBmb3IgZmlyc3QgdHdvCisvLyAgICAgICAgICAgIG9wZXJhdG9ycy4oQmVtYW4gRGF3ZXMpCisvLyAgMTIgTm92IDk5IEFkZCBvcGVyYXRvcnMgdGVtcGxhdGVzIChFZCBCcmV5KQorLy8gIDExIE5vdiA5OSBBZGQgc2luZ2xlIHRlbXBsYXRlIHBhcmFtZXRlciB2ZXJzaW9uIGZvciBjb21waWxlcnMgd2l0aG91dAorLy8gICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChCZW1hbiBEYXdlcykKKy8vICAxMCBOb3YgOTkgSW5pdGlhbCB2ZXJzaW9uCisKKy8vIDEwIEp1biAwMDoKKy8vIEFuIGFkZGl0aW9uYWwgb3B0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyIHdhcyBhZGRlZCB0byBtb3N0IG9mCisvLyBvcGVyYXRvciB0ZW1wbGF0ZXMgdG8gc3VwcG9ydCB0aGUgYmFzZSBjbGFzcyBjaGFpbmluZyB0ZWNobmlxdWUgKHNlZQorLy8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldGFpbHMpLiBVbmZvcnR1bmF0ZWx5LCBhIHN0cmFpZ2h0Zm9yd2FyZAorLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaGFuZ2Ugd291bGQgaGF2ZSBicm9rZW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorLy8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBieSBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUKKy8vIHRlbXBsYXRlIG5hbWUgKGUuZy4gJ2FkZGFibGUnKSBmb3IgYm90aCB0aGUgMS0gYW5kIDItYXJndW1lbnQgdmVyc2lvbnMgb2YKKy8vIGFuIG9wZXJhdG9yIHRlbXBsYXRlLiBUaGlzIGltcGxlbWVudGF0aW9uIHNvbHZlcyB0aGUgYmFja3dhcmQtY29tcGF0aWJpbGl0eQorLy8gaXNzdWUgYXQgdGhlIGNvc3Qgb2Ygc29tZSBzaW1wbGljaXR5LgorLy8KKy8vIE9uZSBvZiB0aGUgY29tcGxpY2F0aW9ucyBpcyBhbiBleGlzdGVuY2Ugb2Ygc3BlY2lhbCBhdXhpbGlhcnkgY2xhc3MgdGVtcGxhdGUKKy8vICdpc19jaGFpbmVkX2Jhc2U8PicgKHNlZSAnb3BlcmF0b3JzX2RldGFpbCcgbmFtZXNwYWNlIGJlbG93KSwgd2hpY2ggaXMgdXNlZAorLy8gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXRzIHRlbXBsYXRlIHBhcmFtZXRlciBpcyBhIGxpYnJhcnkncyBvcGVyYXRvciB0ZW1wbGF0ZQorLy8gb3Igbm90LiBZb3UgaGF2ZSB0byBzcGVjaWFsaXplICdpc19jaGFpbmVkX2Jhc2U8PicgZm9yIGVhY2ggbmV3CisvLyBvcGVyYXRvciB0ZW1wbGF0ZSB5b3UgYWRkIHRvIHRoZSBsaWJyYXJ5LgorLy8KKy8vIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIG5vbi10cml2aWFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYXJlIGhpZGRlbiBiZWhpbmQKKy8vIHNldmVyYWwgbG9jYWwgbWFjcm9zIGRlZmluZWQgYmVsb3csIGFuZCBhcyBzb29uIGFzIHlvdSB1bmRlcnN0YW5kIHRoZW0sCisvLyB5b3UgdW5kZXJzdGFuZCB0aGUgd2hvbGUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4KKworI2lmbmRlZiBCT09TVF9PUEVSQVRPUlNfSFBQCisjZGVmaW5lIEJPT1NUX09QRVJBVE9SU19IUFAKKworLy8gSWYgb2xkIHdvcmstYXJvdW5kcyBhcmUgbmVlZGVkLCByZWZlciB0byB0aGUgcHJlc2VydmVkIHZlcnNpb24gd2l0aG91dAorLy8gQURMIHByb3RlY3Rpb24uCisjaWYgZGVmaW5lZChCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFKSB8fCBkZWZpbmVkKEJPT1NUX1VTRV9PUEVSQVRPUlNfVjEpCisjaW5jbHVkZSAib3BlcmF0b3JzX3YxLmhwcCIKKyNlbHNlCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvd29ya2Fyb3VuZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29yZS9hZGRyZXNzb2YuaHBwPgorCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICAgcHJhZ21hIHNldCB3b2ZmIDEyMzQKKyNlbmRpZgorCisjaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCA8IDE2MDApCisjICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Mjg0ICkgLy8gY29tcGxhaW50IGFib3V0IHJldHVybiB0eXBlIG9mCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3ItPiBub3QgYmVnaW4gYSBVRFQKKworLy8gSW4gdGhpcyBzZWN0aW9uIHdlIHN1cHBseSB0aGUgeHh4eDEgYW5kIHh4eHgyIGZvcm1zIG9mIHRoZSBvcGVyYXRvcgorLy8gdGVtcGxhdGVzLCB3aGljaCBhcmUgZXhwbGljaXRseSB0YXJnZXRlZCBhdCB0aGUgMS10eXBlLWFyZ3VtZW50IGFuZAorLy8gMi10eXBlLWFyZ3VtZW50IG9wZXJhdG9yIGZvcm1zLCByZXNwZWN0aXZlbHkuCisKK25hbWVzcGFjZSBib29zdAoreworbmFtZXNwYWNlIG9wZXJhdG9yc19pbXBsCit7CituYW1lc3BhY2Ugb3BlcmF0b3JzX2RldGFpbAoreworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgZW1wdHlfYmFzZSB7fTsKKworfSAvLyBuYW1lc3BhY2Ugb3BlcmF0b3JzX2RldGFpbAorCisvLyAgQmFzaWMgb3BlcmF0b3IgY2xhc3NlcyAoY29udHJpYnV0ZWQgYnkgRGF2ZSBBYnJhaGFtcykgLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gIE5vdGUgdGhhdCBmcmllbmQgZnVuY3Rpb25zIGRlZmluZWQgaW4gYSBjbGFzcyBhcmUgaW1wbGljaXRseSBpbmxpbmUuCisvLyAgU2VlIHRoZSBDKysgc3RkLCAxMS40IFtjbGFzcy5mcmllbmRdIHBhcmFncmFwaCA1CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgbGVzc190aGFuX2NvbXBhcmFibGUyIDogQgoreworICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFQmIHgsIGNvbnN0IFUmIHkpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih4ID4geSk7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBUJiB4LCBjb25zdCBVJiB5KSB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeCA8IHkpOyB9CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBVJiB4LCBjb25zdCBUJiB5KSAgeyByZXR1cm4geSA8IHg7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpICB7IHJldHVybiB5ID4geDsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih5IDwgeCk7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVJiB4LCBjb25zdCBUJiB5KSB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeSA+IHgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGxlc3NfdGhhbl9jb21wYXJhYmxlMSA6IEIKK3sKKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpICB7IHJldHVybiB5IDwgeDsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih5IDwgeCk7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeCA8IHkpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGVxdWFsaXR5X2NvbXBhcmFibGUyIDogQgoreworICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFUmIHksIGNvbnN0IFQmIHgpIHsgcmV0dXJuIHggPT0geTsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFUmIHksIGNvbnN0IFQmIHgpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih4ID09IHkpOyB9CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYgeSwgY29uc3QgVSYgeCkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHkgPT0geCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXF1YWxpdHlfY29tcGFyYWJsZTEgOiBCCit7CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPT0geSk7IH0KK307CisKKy8vIEEgbWFjcm8gd2hpY2ggcHJvZHVjZXMgIm5hbWVfMmxlZnQiIGZyb20gIm5hbWUiLgorI2RlZmluZSBCT09TVF9PUEVSQVRPUjJfTEVGVChuYW1lKSBuYW1lIyMyIyNfIyNsZWZ0CisKKy8vICBOUlZPLWZyaWVuZGx5IGltcGxlbWVudGF0aW9uIChjb250cmlidXRlZCBieSBEYW5pZWwgRnJleSkgLS0tLS0tLS0tLS0tLS0tLy8KKworI2lmIGRlZmluZWQoQk9PU1RfSEFTX05SVk8pIHx8IGRlZmluZWQoQk9PU1RfRk9SQ0VfU1lNTUVUUklDX09QRVJBVE9SUykKKworLy8gVGhpcyBpcyB0aGUgb3B0aW1hbCBpbXBsZW1lbnRhdGlvbiBmb3IgSVNPL0FOU0kgQysrLAorLy8gYnV0IGl0IHJlcXVpcmVzIHRoZSBjb21waWxlciB0byBpbXBsZW1lbnQgdGhlIE5SVk8uCisvLyBJZiB0aGUgY29tcGlsZXIgaGFzIG5vIE5SVk8sIHRoaXMgaXMgdGhlIGJlc3Qgc3ltbWV0cmljCisvLyBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUuCisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCBOQU1FLCBPUCApICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBOQU1FIyMyIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFQmIGxocywgY29uc3QgVSYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCBsaHMgKTsgbnJ2IE9QIyM9IHJoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFUmIGxocywgY29uc3QgVCYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCByaHMgKTsgbnJ2IE9QIyM9IGxoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICAgIFwKK3N0cnVjdCBOQU1FIyMxIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFQmIGxocywgY29uc3QgVCYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCBsaHMgKTsgbnJ2IE9QIyM9IHJoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX09QRVJBVE9SX05PTl9DT01NVVRBVElWRSggTkFNRSwgT1AgKSAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBOQU1FIyMyIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFQmIGxocywgY29uc3QgVSYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCBsaHMgKTsgbnJ2IE9QIyM9IHJoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBCT09TVF9PUEVSQVRPUjJfTEVGVChOQU1FKSA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFUmIGxocywgY29uc3QgVCYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCBsaHMgKTsgbnJ2IE9QIyM9IHJoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICAgIFwKK3N0cnVjdCBOQU1FIyMxIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFQmIGxocywgY29uc3QgVCYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IFQgbnJ2KCBsaHMgKTsgbnJ2IE9QIyM9IHJoczsgcmV0dXJuIG5ydjsgfSAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKyNlbHNlIC8vIGRlZmluZWQoQk9PU1RfSEFTX05SVk8pIHx8IGRlZmluZWQoQk9PU1RfRk9SQ0VfU1lNTUVUUklDX09QRVJBVE9SUykKKworLy8gRm9yIGNvbXBpbGVycyB3aXRob3V0IE5SVk8gdGhlIGZvbGxvd2luZyBjb2RlIGlzIG9wdGltYWwsIGJ1dCBub3QKKy8vIHN5bW1ldHJpYyEgIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YKKy8vIEJPT1NUX09QRVJBVE9SMl9MRUZUKE5BTUUpIG9ubHkgbG9va3MgY29vbCwgYnV0IGRvZXNuJ3QgcHJvdmlkZQorLy8gb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgdG8gdGhlIGNvbXBpbGVyIDopCisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCBOQU1FLCBPUCApICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBOQU1FIyMyIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBVJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9IFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFUmIGxocywgVCByaHMgKSB7IHJldHVybiByaHMgT1AjIz0gbGhzOyB9IFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICAgIFwKK3N0cnVjdCBOQU1FIyMxIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBUJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9IFwKK307CisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX09QRVJBVE9SX05PTl9DT01NVVRBVElWRSggTkFNRSwgT1AgKSAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBOQU1FIyMyIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBVJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9IFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKK3N0cnVjdCBCT09TVF9PUEVSQVRPUjJfTEVGVChOQU1FKSA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIGNvbnN0IFUmIGxocywgY29uc3QgVCYgcmhzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IHJldHVybiBUKCBsaHMgKSBPUCMjPSByaHM7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICAgIFwKK3N0cnVjdCBOQU1FIyMxIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBUJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9IFwKK307CisKKyNlbmRpZiAvLyBkZWZpbmVkKEJPT1NUX0hBU19OUlZPKSB8fCBkZWZpbmVkKEJPT1NUX0ZPUkNFX1NZTU1FVFJJQ19PUEVSQVRPUlMpCisKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9DT01NVVRBVElWRSggbXVsdGlwbGlhYmxlLCAqICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9DT01NVVRBVElWRSggYWRkYWJsZSwgKyApCitCT09TVF9CSU5BUllfT1BFUkFUT1JfTk9OX0NPTU1VVEFUSVZFKCBzdWJ0cmFjdGFibGUsIC0gKQorQk9PU1RfQklOQVJZX09QRVJBVE9SX05PTl9DT01NVVRBVElWRSggZGl2aWRhYmxlLCAvICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9OT05fQ09NTVVUQVRJVkUoIG1vZGFibGUsICUgKQorQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCB4b3JhYmxlLCBeICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9DT01NVVRBVElWRSggYW5kYWJsZSwgJiApCitCT09TVF9CSU5BUllfT1BFUkFUT1JfQ09NTVVUQVRJVkUoIG9yYWJsZSwgfCApCisKKyN1bmRlZiBCT09TVF9CSU5BUllfT1BFUkFUT1JfQ09NTVVUQVRJVkUKKyN1bmRlZiBCT09TVF9CSU5BUllfT1BFUkFUT1JfTk9OX0NPTU1VVEFUSVZFCisjdW5kZWYgQk9PU1RfT1BFUkFUT1IyX0xFRlQKKworLy8gIGluY3JlbWVudGFibGUgYW5kIGRlY3JlbWVudGFibGUgY29udHJpYnV0ZWQgYnkgSmVyZW15IFNpZWsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBpbmNyZW1lbnRhYmxlIDogQgoreworICBmcmllbmQgVCBvcGVyYXRvcisrKFQmIHgsIGludCkKKyAgeworICAgIGluY3JlbWVudGFibGVfdHlwZSBucnYoeCk7CisgICAgKyt4OworICAgIHJldHVybiBucnY7CisgIH0KK3ByaXZhdGU6IC8vIFRoZSB1c2Ugb2YgdGhpcyB0eXBlZGVmIHdvcmtzIGFyb3VuZCBhIEJvcmxhbmQgYnVnCisgIHR5cGVkZWYgVCBpbmNyZW1lbnRhYmxlX3R5cGU7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGRlY3JlbWVudGFibGUgOiBCCit7CisgIGZyaWVuZCBUIG9wZXJhdG9yLS0oVCYgeCwgaW50KQorICB7CisgICAgZGVjcmVtZW50YWJsZV90eXBlIG5ydih4KTsKKyAgICAtLXg7CisgICAgcmV0dXJuIG5ydjsKKyAgfQorcHJpdmF0ZTogLy8gVGhlIHVzZSBvZiB0aGlzIHR5cGVkZWYgd29ya3MgYXJvdW5kIGEgQm9ybGFuZCBidWcKKyAgdHlwZWRlZiBUIGRlY3JlbWVudGFibGVfdHlwZTsKK307CisKKy8vICBJdGVyYXRvciBvcGVyYXRvciBjbGFzc2VzIChjb250cmlidXRlZCBieSBKZXJlbXkgU2llaykgLS0tLS0tLS0tLS0tLS0tLS0tLy8KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBkZXJlZmVyZW5jZWFibGUgOiBCCit7CisgIFAgb3BlcmF0b3ItPigpIGNvbnN0CisgIHsKKyAgICByZXR1cm4gOjpib29zdDo6YWRkcmVzc29mKCpzdGF0aWNfY2FzdDxjb25zdCBUJj4oKnRoaXMpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEksIGNsYXNzIFIsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBpbmRleGFibGUgOiBCCit7CisgIFIgb3BlcmF0b3JbXShJIG4pIGNvbnN0CisgIHsKKyAgICByZXR1cm4gKihzdGF0aWNfY2FzdDxjb25zdCBUJj4oKnRoaXMpICsgbik7CisgIH0KK307CisKKy8vICBNb3JlIG9wZXJhdG9yIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAoTlJWTy1mcmllbmRseSBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBEYW5pZWwgRnJleSkgLS0tLS0tLS0tLS0tLS0tLy8KKworI2lmIGRlZmluZWQoQk9PU1RfSEFTX05SVk8pIHx8IGRlZmluZWQoQk9PU1RfRk9SQ0VfU1lNTUVUUklDX09QRVJBVE9SUykKKworI2RlZmluZSBCT09TVF9CSU5BUllfT1BFUkFUT1IoIE5BTUUsIE9QICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4gXAorc3RydWN0IE5BTUUjIzIgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4gICAgICAgICAgXAorc3RydWN0IE5BTUUjIzEgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsKKworI2Vsc2UgLy8gZGVmaW5lZChCT09TVF9IQVNfTlJWTykgfHwgZGVmaW5lZChCT09TVF9GT1JDRV9TWU1NRVRSSUNfT1BFUkFUT1JTKQorCisjZGVmaW5lIEJPT1NUX0JJTkFSWV9PUEVSQVRPUiggTkFNRSwgT1AgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiBcCitzdHJ1Y3QgTkFNRSMjMiA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZyaWVuZCBUIG9wZXJhdG9yIE9QKCBUIGxocywgY29uc3QgVSYgcmhzICkgeyByZXR1cm4gbGhzIE9QIyM9IHJoczsgfSBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgICBcCitzdHJ1Y3QgTkFNRSMjMSA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZyaWVuZCBUIG9wZXJhdG9yIE9QKCBUIGxocywgY29uc3QgVCYgcmhzICkgeyByZXR1cm4gbGhzIE9QIyM9IHJoczsgfSBcCit9OworCisjZW5kaWYgLy8gZGVmaW5lZChCT09TVF9IQVNfTlJWTykgfHwgZGVmaW5lZChCT09TVF9GT1JDRV9TWU1NRVRSSUNfT1BFUkFUT1JTKQorCitCT09TVF9CSU5BUllfT1BFUkFUT1IoIGxlZnRfc2hpZnRhYmxlLCA8PCApCitCT09TVF9CSU5BUllfT1BFUkFUT1IoIHJpZ2h0X3NoaWZ0YWJsZSwgPj4gKQorCisjdW5kZWYgQk9PU1RfQklOQVJZX09QRVJBVE9SCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXF1aXZhbGVudDIgOiBCCit7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVCYgeCwgY29uc3QgVSYgeSkKKyAgeworICAgIHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeCA8IHkpICYmICFzdGF0aWNfY2FzdDxib29sPih4ID4geSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXF1aXZhbGVudDEgOiBCCit7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVCZ4LCBjb25zdCBUJnkpCisgIHsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPCB5KSAmJiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeSA8IHgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHBhcnRpYWxseV9vcmRlcmVkMiA6IEIKK3sKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiB4LCBjb25zdCBVJiB5KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHggPCB5KSB8fCBzdGF0aWNfY2FzdDxib29sPih4ID09IHkpOyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgVCYgeCwgY29uc3QgVSYgeSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPih4ID4geSkgfHwgc3RhdGljX2Nhc3Q8Ym9vbD4oeCA9PSB5KTsgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgVSYgeCwgY29uc3QgVCYgeSkKKyAgICB7IHJldHVybiB5IDwgeDsgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgVSYgeCwgY29uc3QgVCYgeSkKKyAgICB7IHJldHVybiB5ID4geDsgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oeSA+IHgpIHx8IHN0YXRpY19jYXN0PGJvb2w+KHkgPT0geCk7IH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBVJiB4LCBjb25zdCBUJiB5KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHkgPCB4KSB8fCBzdGF0aWNfY2FzdDxib29sPih5ID09IHgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHBhcnRpYWxseV9vcmRlcmVkMSA6IEIKK3sKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpCisgICAgeyByZXR1cm4geSA8IHg7IH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiB4LCBjb25zdCBUJiB5KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHggPCB5KSB8fCBzdGF0aWNfY2FzdDxib29sPih4ID09IHkpOyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgVCYgeCwgY29uc3QgVCYgeSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPih5IDwgeCkgfHwgc3RhdGljX2Nhc3Q8Ym9vbD4oeCA9PSB5KTsgfQorfTsKKworLy8gIENvbWJpbmVkIG9wZXJhdG9yIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0tLS0tLS0tLS0vLworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHRvdGFsbHlfb3JkZXJlZDIKKyAgICA6IGxlc3NfdGhhbl9jb21wYXJhYmxlMjxULCBVCisgICAgLCBlcXVhbGl0eV9jb21wYXJhYmxlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgdG90YWxseV9vcmRlcmVkMQorICAgIDogbGVzc190aGFuX2NvbXBhcmFibGUxPFQKKyAgICAsIGVxdWFsaXR5X2NvbXBhcmFibGUxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBhZGRpdGl2ZTIKKyAgICA6IGFkZGFibGUyPFQsIFUKKyAgICAsIHN1YnRyYWN0YWJsZTI8VCwgVSwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGFkZGl0aXZlMQorICAgIDogYWRkYWJsZTE8VAorICAgICwgc3VidHJhY3RhYmxlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgbXVsdGlwbGljYXRpdmUyCisgICAgOiBtdWx0aXBsaWFibGUyPFQsIFUKKyAgICAsIGRpdmlkYWJsZTI8VCwgVSwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG11bHRpcGxpY2F0aXZlMQorICAgIDogbXVsdGlwbGlhYmxlMTxUCisgICAgLCBkaXZpZGFibGUxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBpbnRlZ2VyX211bHRpcGxpY2F0aXZlMgorICAgIDogbXVsdGlwbGljYXRpdmUyPFQsIFUKKyAgICAsIG1vZGFibGUyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBpbnRlZ2VyX211bHRpcGxpY2F0aXZlMQorICAgIDogbXVsdGlwbGljYXRpdmUxPFQKKyAgICAsIG1vZGFibGUxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBhcml0aG1ldGljMgorICAgIDogYWRkaXRpdmUyPFQsIFUKKyAgICAsIG11bHRpcGxpY2F0aXZlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgYXJpdGhtZXRpYzEKKyAgICA6IGFkZGl0aXZlMTxUCisgICAgLCBtdWx0aXBsaWNhdGl2ZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGludGVnZXJfYXJpdGhtZXRpYzIKKyAgICA6IGFkZGl0aXZlMjxULCBVCisgICAgLCBpbnRlZ2VyX211bHRpcGxpY2F0aXZlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgaW50ZWdlcl9hcml0aG1ldGljMQorICAgIDogYWRkaXRpdmUxPFQKKyAgICAsIGludGVnZXJfbXVsdGlwbGljYXRpdmUxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBiaXR3aXNlMgorICAgIDogeG9yYWJsZTI8VCwgVQorICAgICwgYW5kYWJsZTI8VCwgVQorICAgICwgb3JhYmxlMjxULCBVLCBCCisgICAgICA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBiaXR3aXNlMQorICAgIDogeG9yYWJsZTE8VAorICAgICwgYW5kYWJsZTE8VAorICAgICwgb3JhYmxlMTxULCBCCisgICAgICA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCB1bml0X3N0ZXBwYWJsZQorICAgIDogaW5jcmVtZW50YWJsZTxUCisgICAgLCBkZWNyZW1lbnRhYmxlPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBzaGlmdGFibGUyCisgICAgOiBsZWZ0X3NoaWZ0YWJsZTI8VCwgVQorICAgICwgcmlnaHRfc2hpZnRhYmxlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgc2hpZnRhYmxlMQorICAgIDogbGVmdF9zaGlmdGFibGUxPFQKKyAgICAsIHJpZ2h0X3NoaWZ0YWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHJpbmdfb3BlcmF0b3JzMgorICAgIDogYWRkaXRpdmUyPFQsIFUKKyAgICAsIHN1YnRyYWN0YWJsZTJfbGVmdDxULCBVCisgICAgLCBtdWx0aXBsaWFibGUyPFQsIFUsIEIKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHJpbmdfb3BlcmF0b3JzMQorICAgIDogYWRkaXRpdmUxPFQKKyAgICAsIG11bHRpcGxpYWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfcmluZ19vcGVyYXRvcnMyCisgICAgOiByaW5nX29wZXJhdG9yczI8VCwgVQorICAgICwgdG90YWxseV9vcmRlcmVkMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgb3JkZXJlZF9yaW5nX29wZXJhdG9yczEKKyAgICA6IHJpbmdfb3BlcmF0b3JzMTxUCisgICAgLCB0b3RhbGx5X29yZGVyZWQxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBmaWVsZF9vcGVyYXRvcnMyCisgICAgOiByaW5nX29wZXJhdG9yczI8VCwgVQorICAgICwgZGl2aWRhYmxlMjxULCBVCisgICAgLCBkaXZpZGFibGUyX2xlZnQ8VCwgVSwgQgorICAgICAgPiA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZmllbGRfb3BlcmF0b3JzMQorICAgIDogcmluZ19vcGVyYXRvcnMxPFQKKyAgICAsIGRpdmlkYWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfZmllbGRfb3BlcmF0b3JzMgorICAgIDogZmllbGRfb3BlcmF0b3JzMjxULCBVCisgICAgLCB0b3RhbGx5X29yZGVyZWQyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvcmRlcmVkX2ZpZWxkX29wZXJhdG9yczEKKyAgICA6IGZpZWxkX29wZXJhdG9yczE8VAorICAgICwgdG90YWxseV9vcmRlcmVkMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMgorICAgIDogcmluZ19vcGVyYXRvcnMyPFQsIFUKKyAgICAsIGRpdmlkYWJsZTI8VCwgVQorICAgICwgZGl2aWRhYmxlMl9sZWZ0PFQsIFUKKyAgICAsIG1vZGFibGUyPFQsIFUKKyAgICAsIG1vZGFibGUyX2xlZnQ8VCwgVSwgQgorICAgICAgPiA+ID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGV1Y2xpZGlhbl9yaW5nX29wZXJhdG9yczEKKyAgICA6IHJpbmdfb3BlcmF0b3JzMTxUCisgICAgLCBkaXZpZGFibGUxPFQKKyAgICAsIG1vZGFibGUxPFQsIEIKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMgorICAgIDogdG90YWxseV9vcmRlcmVkMjxULCBVCisgICAgLCBldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvcmRlcmVkX2V1Y2xpZGlhbl9yaW5nX29wZXJhdG9yczEKKyAgICA6IHRvdGFsbHlfb3JkZXJlZDE8VAorICAgICwgZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMgorICAgIDogcmluZ19vcGVyYXRvcnMyPFQsIFUKKyAgICAsIGRpdmlkYWJsZTI8VCwgVQorICAgICwgZGl2aWRhYmxlMl9sZWZ0PFQsIFUKKyAgICAsIG1vZGFibGUyPFQsIFUKKyAgICAsIG1vZGFibGUyX2xlZnQ8VCwgVSwgQgorICAgICAgPiA+ID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczEKKyAgICA6IHJpbmdfb3BlcmF0b3JzMTxUCisgICAgLCBkaXZpZGFibGUxPFQKKyAgICAsIG1vZGFibGUxPFQsIEIKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IG9wZXJhdG9yc19kZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMgorICAgIDogdG90YWxseV9vcmRlcmVkMjxULCBVCisgICAgLCBldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvcmRlcmVkX2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczEKKyAgICA6IHRvdGFsbHlfb3JkZXJlZDE8VAorICAgICwgZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBQLCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgaW5wdXRfaXRlcmF0YWJsZQorICAgIDogZXF1YWxpdHlfY29tcGFyYWJsZTE8VAorICAgICwgaW5jcmVtZW50YWJsZTxUCisgICAgLCBkZXJlZmVyZW5jZWFibGU8VCwgUCwgQgorICAgICAgPiA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgb3V0cHV0X2l0ZXJhdGFibGUKKyAgICA6IGluY3JlbWVudGFibGU8VCwgQgorICAgICAgPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBmb3J3YXJkX2l0ZXJhdGFibGUKKyAgICA6IGlucHV0X2l0ZXJhdGFibGU8VCwgUCwgQgorICAgICAgPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdGFibGUKKyAgICA6IGZvcndhcmRfaXRlcmF0YWJsZTxULCBQCisgICAgLCBkZWNyZW1lbnRhYmxlPFQsIEIKKyAgICAgID4gPiB7fTsKKworLy8gIFRvIGF2b2lkIHJlcGVhdGVkIGRlcml2YXRpb24gZnJvbSBlcXVhbGl0eV9jb21wYXJhYmxlLAorLy8gIHdoaWNoIGlzIGFuIGluZGlyZWN0IGJhc2UgY2xhc3Mgb2YgYmlkaXJlY3Rpb25hbF9pdGVyYWJsZSwKKy8vICByYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUgbXVzdCBub3QgYmUgZGVyaXZlZCBmcm9tIHRvdGFsbHlfb3JkZXJlZDEKKy8vICBidXQgZnJvbSBsZXNzX3RoYW5fY29tcGFyYWJsZTEgb25seS4gKEhlbG11dCBaZWlzZWwsIDAyLURlYy0yMDAxKQordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEQsIGNsYXNzIFIsIGNsYXNzIEIgPSBvcGVyYXRvcnNfZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUKKyAgICA6IGJpZGlyZWN0aW9uYWxfaXRlcmF0YWJsZTxULCBQCisgICAgLCBsZXNzX3RoYW5fY29tcGFyYWJsZTE8VAorICAgICwgYWRkaXRpdmUyPFQsIEQKKyAgICAsIGluZGV4YWJsZTxULCBELCBSLCBCCisgICAgICA+ID4gPiA+IHt9OworCisKKy8vCisvLyBIZXJlJ3Mgd2hlcmUgd2UgcHV0IGl0IGFsbCB0b2dldGhlciwgZGVmaW5pbmcgdGhlIHh4eHggZm9ybXMgb2YgdGhlIHRlbXBsYXRlcy4KKy8vIFdlIGFsc28gZGVmaW5lIHNwZWNpYWxpemF0aW9ucyBvZiBpc19jaGFpbmVkX2Jhc2U8PiBmb3IKKy8vIHRoZSB4eHh4LCB4eHh4MSwgYW5kIHh4eHgyIHRlbXBsYXRlcy4KKy8vCisKK25hbWVzcGFjZSBvcGVyYXRvcnNfZGV0YWlsCit7CisKKy8vIEEgdHlwZSBwYXJhbWV0ZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcGxhaW4gYm9vbCBiZWNhdXNlIEJvcmxhbmQncyBjb21waWxlcgorLy8gZGlkbid0IGNvcGUgd2VsbCB3aXRoIHRoZSBtb3JlIG9idmlvdXMgbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorc3RydWN0IHRydWVfdCB7fTsKK3N0cnVjdCBmYWxzZV90IHt9OworCit9IC8vIG5hbWVzcGFjZSBvcGVyYXRvcnNfZGV0YWlsCisKKy8vIGlzX2NoYWluZWRfYmFzZTw+IC0gYSB0cmFpdHMgY2xhc3MgdXNlZCB0byBkaXN0aW5ndWlzaCB3aGV0aGVyIGFuIG9wZXJhdG9yCisvLyB0ZW1wbGF0ZSBhcmd1bWVudCBpcyBiZWluZyB1c2VkIGZvciBiYXNlIGNsYXNzIGNoYWluaW5nLCBvciBpcyBzcGVjaWZ5aW5nIGEKKy8vIDJuZCBhcmd1bWVudCB0eXBlLgorCisvLyBVbnNwZWNpYWxpemVkIHZlcnNpb24gYXNzdW1lcyB0aGF0IG1vc3QgdHlwZXMgYXJlIG5vdCBiZWluZyB1c2VkIGZvciBiYXNlCisvLyBjbGFzcyBjaGFpbmluZy4gV2Ugc3BlY2lhbGl6ZSBmb3IgdGhlIG9wZXJhdG9yIHRlbXBsYXRlcyBkZWZpbmVkIGluIHRoaXMKKy8vIGxpYnJhcnkuCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgaXNfY2hhaW5lZF9iYXNlIHsKKyAgdHlwZWRlZiBvcGVyYXRvcnNfZGV0YWlsOjpmYWxzZV90IHZhbHVlOworfTsKKworLy8gUHJvdmlkZSBhIHNwZWNpYWxpemF0aW9uIG9mICdpc19jaGFpbmVkX2Jhc2U8PicKKy8vIGZvciBhIDQtdHlwZS1hcmd1bWVudCBvcGVyYXRvciB0ZW1wbGF0ZS4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFNCh0ZW1wbGF0ZV9uYW1lNCkgICAgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgQj4gICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgdGVtcGxhdGVfbmFtZTQ8VCwgVSwgViwgVywgQj4gPiB7IFwKKyAgICB0eXBlZGVmIG9wZXJhdG9yc19kZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworLy8gUHJvdmlkZSBhIHNwZWNpYWxpemF0aW9uIG9mICdpc19jaGFpbmVkX2Jhc2U8PicKKy8vIGZvciBhIDMtdHlwZS1hcmd1bWVudCBvcGVyYXRvciB0ZW1wbGF0ZS4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMyh0ZW1wbGF0ZV9uYW1lMykgICAgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgQj4gICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgdGVtcGxhdGVfbmFtZTM8VCwgVSwgViwgQj4gPiB7IFwKKyAgICB0eXBlZGVmIG9wZXJhdG9yc19kZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgIFwKKyAgfTsKKworLy8gUHJvdmlkZSBhIHNwZWNpYWxpemF0aW9uIG9mICdpc19jaGFpbmVkX2Jhc2U8PicKKy8vIGZvciBhIDItdHlwZS1hcmd1bWVudCBvcGVyYXRvciB0ZW1wbGF0ZS4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMih0ZW1wbGF0ZV9uYW1lMikgICAgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQj4gICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgdGVtcGxhdGVfbmFtZTI8VCwgVSwgQj4gPiB7IFwKKyAgICB0eXBlZGVmIG9wZXJhdG9yc19kZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgIFwKKyAgfTsKKworLy8gUHJvdmlkZSBhIHNwZWNpYWxpemF0aW9uIG9mICdpc19jaGFpbmVkX2Jhc2U8PicKKy8vIGZvciBhIDEtdHlwZS1hcmd1bWVudCBvcGVyYXRvciB0ZW1wbGF0ZS4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMSh0ZW1wbGF0ZV9uYW1lMSkgIFwKKyAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQj4gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgdGVtcGxhdGVfbmFtZTE8VCwgQj4gPiB7IFwKKyAgICB0eXBlZGVmIG9wZXJhdG9yc19kZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgIFwKKyAgfTsKKworLy8gQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUodGVtcGxhdGVfbmFtZSkgZGVmaW5lcyB0ZW1wbGF0ZV9uYW1lPD4gc3VjaCB0aGF0IGl0CisvLyBjYW4gYmUgdXNlZCBmb3Igc3BlY2lmeWluZyBib3RoIDEtYXJndW1lbnQgYW5kIDItYXJndW1lbnQgZm9ybXMuIFJlcXVpcmVzIHRoZQorLy8gZXhpc3RlbmNlIG9mIHR3byBwcmV2aW91c2x5IGRlZmluZWQgY2xhc3MgdGVtcGxhdGVzIG5hbWVkICc8dGVtcGxhdGVfbmFtZT4xJworLy8gYW5kICc8dGVtcGxhdGVfbmFtZT4yJyB3aGljaCBtdXN0IGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZyAxLSBhbmQgMi0KKy8vIGFyZ3VtZW50IGZvcm1zLgorLy8KKy8vIFRoZSB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBPID09IGlzX2NoYWluZWRfYmFzZTxVPjo6dmFsdWUgaXMgdXNlZCB0bworLy8gZGlzdGluZ3Vpc2ggd2hldGhlciB0aGUgMm5kIGFyZ3VtZW50IHRvIDx0ZW1wbGF0ZV9uYW1lPiBpcyBiZWluZyB1c2VkIGZvcgorLy8gYmFzZSBjbGFzcyBjaGFpbmluZyBmcm9tIGFub3RoZXIgYm9vc3Qgb3BlcmF0b3IgdGVtcGxhdGUgb3IgaXMgZGVzY3JpYmluZyBhCisvLyAybmQgb3BlcmFuZCB0eXBlLiBPID09IHRydWVfdCBvbmx5IHdoZW4gVSBpcyBhY3R1YWxseSBhbiBhbm90aGVyIG9wZXJhdG9yCisvLyB0ZW1wbGF0ZSBmcm9tIHRoZSBsaWJyYXJ5LiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGFuCisvLyBpbXBsZW1lbnRhdGlvbiBpbiB0ZXJtcyBvZiBlaXRoZXIgJzx0ZW1wbGF0ZV9uYW1lPjEnIG9yICc8dGVtcGxhdGVfbmFtZT4yJy4KKy8vCisKKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHRlbXBsYXRlX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAsY2xhc3MgVSA9IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICxjbGFzcyBCID0gb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgLGNsYXNzIE8gPSB0eXBlbmFtZSBpc19jaGFpbmVkX2Jhc2U8VT46OnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCB0ZW1wbGF0ZV9uYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCB0ZW1wbGF0ZV9uYW1lPFQsIFUsIEIsIG9wZXJhdG9yc19kZXRhaWw6OmZhbHNlX3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6IHRlbXBsYXRlX25hbWUjIzI8VCwgVSwgQj4ge307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHRlbXBsYXRlX25hbWU8VCwgVSwgb3BlcmF0b3JzX2RldGFpbDo6ZW1wdHlfYmFzZTxUPiwgb3BlcmF0b3JzX2RldGFpbDo6dHJ1ZV90PiBcCisgIDogdGVtcGxhdGVfbmFtZSMjMTxULCBVPiB7fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgdGVtcGxhdGVfbmFtZTxULCBULCBCLCBvcGVyYXRvcnNfZGV0YWlsOjpmYWxzZV90PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiB0ZW1wbGF0ZV9uYW1lIyMxPFQsIEI+IHt9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCLCBjbGFzcyBPPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBpc19jaGFpbmVkX2Jhc2U8IHRlbXBsYXRlX25hbWU8VCwgVSwgQiwgTz4gPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlZGVmIG9wZXJhdG9yc19kZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUyKHRlbXBsYXRlX25hbWUjIzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTEodGVtcGxhdGVfbmFtZSMjMSkKKworQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUobGVzc190aGFuX2NvbXBhcmFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShlcXVhbGl0eV9jb21wYXJhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUobXVsdGlwbGlhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoYWRkYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHN1YnRyYWN0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihzdWJ0cmFjdGFibGUyX2xlZnQpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShkaXZpZGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIoZGl2aWRhYmxlMl9sZWZ0KQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUobW9kYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihtb2RhYmxlMl9sZWZ0KQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoeG9yYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGFuZGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShvcmFibGUpCisKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMShpbmNyZW1lbnRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUxKGRlY3JlbWVudGFibGUpCisKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihkZXJlZmVyZW5jZWFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTMoaW5kZXhhYmxlKQorCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShsZWZ0X3NoaWZ0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHJpZ2h0X3NoaWZ0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGVxdWl2YWxlbnQpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShwYXJ0aWFsbHlfb3JkZXJlZCkKKworQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUodG90YWxseV9vcmRlcmVkKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoYWRkaXRpdmUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShtdWx0aXBsaWNhdGl2ZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGludGVnZXJfbXVsdGlwbGljYXRpdmUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShhcml0aG1ldGljKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoaW50ZWdlcl9hcml0aG1ldGljKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoYml0d2lzZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMSh1bml0X3N0ZXBwYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHNoaWZ0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHJpbmdfb3BlcmF0b3JzKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUob3JkZXJlZF9yaW5nX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGZpZWxkX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKG9yZGVyZWRfZmllbGRfb3BlcmF0b3JzKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUob3JkZXJlZF9ldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShvcmRlcmVkX2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihpbnB1dF9pdGVyYXRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUxKG91dHB1dF9pdGVyYXRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUyKGZvcndhcmRfaXRlcmF0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihiaWRpcmVjdGlvbmFsX2l0ZXJhdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTQocmFuZG9tX2FjY2Vzc19pdGVyYXRhYmxlKQorCisjdW5kZWYgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUKKyN1bmRlZiBCT09TVF9PUEVSQVRPUl9URU1QTEFURTQKKyN1bmRlZiBCT09TVF9PUEVSQVRPUl9URU1QTEFURTMKKyN1bmRlZiBCT09TVF9PUEVSQVRPUl9URU1QTEFURTIKKyN1bmRlZiBCT09TVF9PUEVSQVRPUl9URU1QTEFURTEKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitzdHJ1Y3Qgb3BlcmF0b3JzMgorICAgIDogdG90YWxseV9vcmRlcmVkMjxULFUKKyAgICAsIGludGVnZXJfYXJpdGhtZXRpYzI8VCxVCisgICAgLCBiaXR3aXNlMjxULFUKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSA9IFQ+CitzdHJ1Y3Qgb3BlcmF0b3JzIDogb3BlcmF0b3JzMjxULCBVPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBvcGVyYXRvcnM8VCwgVD4KKyAgICA6IHRvdGFsbHlfb3JkZXJlZDxUCisgICAgLCBpbnRlZ2VyX2FyaXRobWV0aWM8VAorICAgICwgYml0d2lzZTxUCisgICAgLCB1bml0X3N0ZXBwYWJsZTxUCisgICAgICA+ID4gPiA+IHt9OworCisvLyAgSXRlcmF0b3IgaGVscGVyIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IEplcmVteSBTaWVrKSAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAoSW5wdXQgYW5kIG91dHB1dCBpdGVyYXRvciBoZWxwZXJzIGNvbnRyaWJ1dGVkIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0vLworLy8gIChDaGFuZ2VkIHRvIHVzZSBjb21iaW5lZCBvcGVyYXRvciBjbGFzc2VzIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0tLS0tLS8vCisvLyAgKEFkYXB0ZWQgdG8gQysrMTcgYnkgRGFuaWVsIEZyZXkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3RlbXBsYXRlIDxjbGFzcyBDYXRlZ29yeSwKKyAgICAgICAgICBjbGFzcyBULAorICAgICAgICAgIGNsYXNzIERpc3RhbmNlID0gc3RkOjpwdHJkaWZmX3QsCisgICAgICAgICAgY2xhc3MgUG9pbnRlciA9IFQqLAorICAgICAgICAgIGNsYXNzIFJlZmVyZW5jZSA9IFQmPgorc3RydWN0IGl0ZXJhdG9yX2hlbHBlcgoreworICB0eXBlZGVmIENhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBEaXN0YW5jZSBkaWZmZXJlbmNlX3R5cGU7CisgIHR5cGVkZWYgUG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIFJlZmVyZW5jZSByZWZlcmVuY2U7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyBWLAorICAgICAgICAgIGNsYXNzIEQgPSBzdGQ6OnB0cmRpZmZfdCwKKyAgICAgICAgICBjbGFzcyBQID0gViBjb25zdCAqLAorICAgICAgICAgIGNsYXNzIFIgPSBWIGNvbnN0ICY+CitzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfaGVscGVyCisgIDogaW5wdXRfaXRlcmF0YWJsZTxULCBQCisgICwgaXRlcmF0b3JfaGVscGVyPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBWLCBELCBQLCBSCisgICAgPiA+IHt9OworCit0ZW1wbGF0ZTxjbGFzcyBUPgorc3RydWN0IG91dHB1dF9pdGVyYXRvcl9oZWxwZXIKKyAgOiBvdXRwdXRfaXRlcmF0YWJsZTxUCisgICwgaXRlcmF0b3JfaGVscGVyPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZAorICA+ID4KK3sKKyAgVCYgb3BlcmF0b3IqKCkgIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQmPigqdGhpcyk7IH0KKyAgVCYgb3BlcmF0b3IrKygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQmPigqdGhpcyk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULAorICAgICAgICAgIGNsYXNzIFYsCisgICAgICAgICAgY2xhc3MgRCA9IHN0ZDo6cHRyZGlmZl90LAorICAgICAgICAgIGNsYXNzIFAgPSBWKiwKKyAgICAgICAgICBjbGFzcyBSID0gViY+CitzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRvcl9oZWxwZXIKKyAgOiBmb3J3YXJkX2l0ZXJhdGFibGU8VCwgUAorICAsIGl0ZXJhdG9yX2hlbHBlcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBWLCBELCBQLCBSCisgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyBWLAorICAgICAgICAgIGNsYXNzIEQgPSBzdGQ6OnB0cmRpZmZfdCwKKyAgICAgICAgICBjbGFzcyBQID0gViosCisgICAgICAgICAgY2xhc3MgUiA9IFYmPgorc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfaGVscGVyCisgIDogYmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlPFQsIFAKKyAgLCBpdGVyYXRvcl9oZWxwZXI8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgViwgRCwgUCwgUgorICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgViwKKyAgICAgICAgICBjbGFzcyBEID0gc3RkOjpwdHJkaWZmX3QsCisgICAgICAgICAgY2xhc3MgUCA9IFYqLAorICAgICAgICAgIGNsYXNzIFIgPSBWJj4KK3N0cnVjdCByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX2hlbHBlcgorICA6IHJhbmRvbV9hY2Nlc3NfaXRlcmF0YWJsZTxULCBQLCBELCBSCisgICwgaXRlcmF0b3JfaGVscGVyPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIFYsIEQsIFAsIFIKKyAgICA+ID4KK3sKKyAgZnJpZW5kIEQgcmVxdWlyZXNfZGlmZmVyZW5jZV9vcGVyYXRvcihjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7CisgICAgcmV0dXJuIHggLSB5OworICB9Cit9OyAvLyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX2hlbHBlcgorCit9IC8vIG5hbWVzcGFjZSBvcGVyYXRvcnNfaW1wbAordXNpbmcgbmFtZXNwYWNlIG9wZXJhdG9yc19pbXBsOworCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pCisjcHJhZ21hIHJlc2V0IHdvZmYgMTIzNAorI2VuZGlmCisKKyNlbmRpZiAvLyBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCisjZW5kaWYgLy8gQk9PU1RfT1BFUkFUT1JTX0hQUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC9vcGVyYXRvcnNfdjEuaHBwIGIvaW5jbHVkZS9ib29zdC9vcGVyYXRvcnNfdjEuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzUzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L29wZXJhdG9yc192MS5ocHAKQEAgLTAsMCArMSw5NTEgQEAKKy8vICBCb29zdCBvcGVyYXRvcnMuaHBwIGhlYWRlciBmaWxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gIChDKSBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMsIEplcmVteSBTaWVrLCBEYXJ5bGUgV2Fsa2VyIDE5OTktMjAwMS4KKy8vICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vICBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkvb3BlcmF0b3JzLmh0bSBmb3IgZG9jdW1lbnRhdGlvbi4KKworLy8gIFJldmlzaW9uIEhpc3RvcnkKKy8vICAyMiBGZWIgMTYgUHJlc2VydmUgb2xkIHdvcmstYXJvdW5kcy4gKERhbmllbCBGcmV5KQorLy8gIDE2IERlYyAxMCBMaW1pdCB3YXJuaW5nIHN1cHByZXNzaW9uIGZvciA0Mjg0IHRvIG9sZGVyIHZlcnNpb25zIG9mIFZDKysKKy8vICAgICAgICAgICAgKE1hdHRoZXcgQnJhZGJ1cnksIGZpeGVzICM0NDMyKQorLy8gIDA3IEF1ZyAwOCBBZGRlZCAiZXVjbGlkZWFuIiBzcGVsbGluZy4gKERhbmllbCBGcmV5KQorLy8gIDAzIEFwciAwOCBNYWtlIHN1cmUgImNvbnZlcnRpYmxlIHRvIGJvb2wiIGlzIHN1ZmZpY2llbnQKKy8vICAgICAgICAgICAgZm9yIFQ6Om9wZXJhdG9yPCwgZXRjLiAoRGFuaWVsIEZyZXkpCisvLyAgMjQgTWF5IDA3IENoYW5nZWQgZW1wdHlfYmFzZSB0byBkZXBlbmQgb24gVCwgc2VlCisvLyAgICAgICAgICAgIGh0dHA6Ly9zdm4uYm9vc3Qub3JnL3RyYWMvYm9vc3QvdGlja2V0Lzk3OQorLy8gIDIxIE9jdCAwMiBNb2RpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBvcGVyYXRvcnMgdG8gYWxsb3cgY29tcGlsZXJzIHdpdGggYQorLy8gICAgICAgICAgICBjb3JyZWN0IG5hbWVkIHJldHVybiB2YWx1ZSBvcHRpbWl6YXRpb24gKE5SVk8pIHRvIHByb2R1Y2Ugb3B0aW1hbAorLy8gICAgICAgICAgICBjb2RlLiAgKERhbmllbCBGcmV5KQorLy8gIDAyIERlYyAwMSBCdWcgZml4ZWQgaW4gcmFuZG9tX2FjY2Vzc19pdGVyYXRhYmxlLiAgKEhlbG11dCBaZWlzZWwpCisvLyAgMjggU2VwIDAxIEZhY3RvcmVkIG91dCBpdGVyYXRvciBvcGVyYXRvciBncm91cHMuICAoRGFyeWxlIFdhbGtlcikKKy8vICAyNyBBdWcgMDEgJ2xlZnQnIGZvcm0gZm9yIG5vbiBjb21tdXRhdGl2ZSBvcGVyYXRvcnMgYWRkZWQ7CisvLyAgICAgICAgICAgIGFkZGl0aW9uYWwgY2xhc3NlcyBmb3IgZ3JvdXBzIG9mIHJlbGF0ZWQgb3BlcmF0b3JzIGFkZGVkOworLy8gICAgICAgICAgICB3b3JrYXJvdW5kIGZvciBlbXB0eSBiYXNlIGNsYXNzIG9wdGltaXphdGlvbgorLy8gICAgICAgICAgICBidWcgb2YgR0NDIDMuMCAoSGVsbXV0IFplaXNlbCkKKy8vICAyNSBKdW4gMDEgb3V0cHV0X2l0ZXJhdG9yX2hlbHBlciBjaGFuZ2VzOiByZW1vdmVkIGRlZmF1bHQgdGVtcGxhdGUgCisvLyAgICAgICAgICAgIHBhcmFtZXRlcnMsIGFkZGVkIHN1cHBvcnQgZm9yIHNlbGYtcHJveHlpbmcsIGFkZGl0aW9uYWwgCisvLyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYW5kIHRlc3RzIChBbGVrc2V5IEd1cnRvdm95KQorLy8gIDI5IE1heSAwMSBBZGRlZCBvcGVyYXRvciBjbGFzc2VzIGZvciA8PCBhbmQgPj4uICBBZGRlZCBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgICAgICAgIGl0ZXJhdG9yIGhlbHBlciBjbGFzc2VzLiAgQWRkZWQgY2xhc3NlcyB0byBjb25uZWN0IGVxdWFsaXR5IGFuZAorLy8gICAgICAgICAgICByZWxhdGlvbmFsIG9wZXJhdG9ycy4gIEFkZGVkIGNsYXNzZXMgZm9yIGdyb3VwcyBvZiByZWxhdGVkCisvLyAgICAgICAgICAgIG9wZXJhdG9ycy4gIFJlaW1wbGVtZW50ZWQgZXhhbXBsZSBvcGVyYXRvciBhbmQgaXRlcmF0b3IgaGVscGVyCisvLyAgICAgICAgICAgIGNsYXNzZXMgaW4gdGVybXMgb2YgdGhlIG5ldyBncm91cHMuICAoRGFyeWxlIFdhbGtlciwgd2l0aCBoZWxwCisvLyAgICAgICAgICAgIGZyb20gQWxleHkgR3VydG92b3kpCisvLyAgMTEgRmViIDAxIEZpeGVkIGJ1Z3MgaW4gdGhlIGl0ZXJhdG9yIGhlbHBlcnMgd2hpY2ggcHJldmVudGVkIGV4cGxpY2l0bHkKKy8vICAgICAgICAgICAgc3VwcGxpZWQgYXJndW1lbnRzIGZyb20gYWN0dWFsbHkgYmVpbmcgdXNlZCAoRGF2ZSBBYnJhaGFtcykKKy8vICAwNCBKdWwgMDAgRml4ZWQgTk9fT1BFUkFUT1JTX0lOX05BTUVTUEFDRSBidWdzLCBtYWpvciBjbGVhbnVwIGFuZAorLy8gICAgICAgICAgICByZWZhY3RvcmluZyBvZiBjb21waWxlciB3b3JrYXJvdW5kcywgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uCisvLyAgICAgICAgICAgIChBbGV4eSBHdXJ0b3ZveSBhbmQgTWFyayBSb2RnZXJzIHdpdGggc29tZSBoZWxwIGFuZCBwcm9tcHRpbmcgZnJvbQorLy8gICAgICAgICAgICBEYXZlIEFicmFoYW1zKSAKKy8vICAyOCBKdW4gMDAgR2VuZXJhbCBjbGVhbnVwIGFuZCBpbnRlZ3JhdGlvbiBvZiBidWdmaXhlcyBmcm9tIE1hcmsgUm9kZ2VycyBhbmQKKy8vICAgICAgICAgICAgSmVyZW15IFNpZWsgKERhdmUgQWJyYWhhbXMpCisvLyAgMjAgSnVuIDAwIENoYW5nZXMgdG8gYWNjb21tb2RhdGUgQm9ybGFuZCBDKytCdWlsZGVyIDQgYW5kIEJvcmxhbmQgQysrIDUuNQorLy8gICAgICAgICAgICAoTWFyayBSb2RnZXJzKQorLy8gIDIwIEp1biAwMCBNaW5vciBmaXhlcyB0byB0aGUgcHJpb3IgcmV2aXNpb24gKEFsZWtzZXkgR3VydG92b3kpCisvLyAgMTAgSnVuIDAwIFN1cHBvcnQgZm9yIHRoZSBiYXNlIGNsYXNzIGNoYWluaW5nIHRlY2huaXF1ZSB3YXMgYWRkZWQKKy8vICAgICAgICAgICAgKEFsZWtzZXkgR3VydG92b3kpLiBTZWUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGNvbW1lbnRzIGJlbG93IAorLy8gICAgICAgICAgICBmb3IgdGhlIGRldGFpbHMuIAorLy8gIDEyIERlYyA5OSBJbml0aWFsIHZlcnNpb24gd2l0aCBpdGVyYXRvciBvcGVyYXRvcnMgKEplcmVteSBTaWVrKQorLy8gIDE4IE5vdiA5OSBDaGFuZ2UgbmFtZSAiZGl2aWRlYWJsZSIgdG8gImRpdmlkYWJsZSIsIHJlbW92ZSB1bm5lY2Vzc2FyeQorLy8gICAgICAgICAgICBzcGVjaWFsaXphdGlvbnMgb2YgZGl2aWRhYmxlLCBzdWJ0cmFjdGFibGUsIG1vZGFibGUgKEVkIEJyZXkpIAorLy8gIDE3IE5vdiA5OSBBZGQgY29tbWVudHMgKEJlbWFuIERhd2VzKQorLy8gICAgICAgICAgICBSZW1vdmUgdW5uZWNlc3Nhcnkgc3BlY2lhbGl6YXRpb24gb2Ygb3BlcmF0b3JzPD4gKEVkIEJyZXkpCisvLyAgMTUgTm92IDk5IEZpeCBsZXNzX3RoYW5fY29tcGFyYWJsZTxULFU+IHNlY29uZCBvcGVyYW5kIHR5cGUgZm9yIGZpcnN0IHR3bworLy8gICAgICAgICAgICBvcGVyYXRvcnMuKEJlbWFuIERhd2VzKQorLy8gIDEyIE5vdiA5OSBBZGQgb3BlcmF0b3JzIHRlbXBsYXRlcyAoRWQgQnJleSkKKy8vICAxMSBOb3YgOTkgQWRkIHNpbmdsZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdmVyc2lvbiBmb3IgY29tcGlsZXJzIHdpdGhvdXQKKy8vICAgICAgICAgICAgcGFydGlhbCBzcGVjaWFsaXphdGlvbiAoQmVtYW4gRGF3ZXMpCisvLyAgMTAgTm92IDk5IEluaXRpYWwgdmVyc2lvbgorCisvLyAxMCBKdW4gMDA6CisvLyBBbiBhZGRpdGlvbmFsIG9wdGlvbmFsIHRlbXBsYXRlIHBhcmFtZXRlciB3YXMgYWRkZWQgdG8gbW9zdCBvZiAKKy8vIG9wZXJhdG9yIHRlbXBsYXRlcyB0byBzdXBwb3J0IHRoZSBiYXNlIGNsYXNzIGNoYWluaW5nIHRlY2huaXF1ZSAoc2VlIAorLy8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldGFpbHMpLiBVbmZvcnR1bmF0ZWx5LCBhIHN0cmFpZ2h0Zm9yd2FyZAorLy8gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjaGFuZ2Ugd291bGQgaGF2ZSBicm9rZW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorLy8gcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBieSBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUKKy8vIHRlbXBsYXRlIG5hbWUgKGUuZy4gJ2FkZGFibGUnKSBmb3IgYm90aCB0aGUgMS0gYW5kIDItYXJndW1lbnQgdmVyc2lvbnMgb2YKKy8vIGFuIG9wZXJhdG9yIHRlbXBsYXRlLiBUaGlzIGltcGxlbWVudGF0aW9uIHNvbHZlcyB0aGUgYmFja3dhcmQtY29tcGF0aWJpbGl0eQorLy8gaXNzdWUgYXQgdGhlIGNvc3Qgb2Ygc29tZSBzaW1wbGljaXR5LgorLy8KKy8vIE9uZSBvZiB0aGUgY29tcGxpY2F0aW9ucyBpcyBhbiBleGlzdGVuY2Ugb2Ygc3BlY2lhbCBhdXhpbGlhcnkgY2xhc3MgdGVtcGxhdGUKKy8vICdpc19jaGFpbmVkX2Jhc2U8PicgKHNlZSAnZGV0YWlsJyBuYW1lc3BhY2UgYmVsb3cpLCB3aGljaCBpcyB1c2VkCisvLyB0byBkZXRlcm1pbmUgd2hldGhlciBpdHMgdGVtcGxhdGUgcGFyYW1ldGVyIGlzIGEgbGlicmFyeSdzIG9wZXJhdG9yIHRlbXBsYXRlCisvLyBvciBub3QuIFlvdSBoYXZlIHRvIHNwZWNpYWxpemUgJ2lzX2NoYWluZWRfYmFzZTw+JyBmb3IgZWFjaCBuZXcgCisvLyBvcGVyYXRvciB0ZW1wbGF0ZSB5b3UgYWRkIHRvIHRoZSBsaWJyYXJ5LgorLy8KKy8vIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIG5vbi10cml2aWFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYXJlIGhpZGRlbiBiZWhpbmQgCisvLyBzZXZlcmFsIGxvY2FsIG1hY3JvcyBkZWZpbmVkIGJlbG93LCBhbmQgYXMgc29vbiBhcyB5b3UgdW5kZXJzdGFuZCB0aGVtLAorLy8geW91IHVuZGVyc3RhbmQgdGhlIHdob2xlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uIAorCisjaWZuZGVmIEJPT1NUX09QRVJBVE9SU19WMV9IUFAKKyNkZWZpbmUgQk9PU1RfT1BFUkFUT1JTX1YxX0hQUAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL3dvcmthcm91bmQuaHBwPgorCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICAgcHJhZ21hIHNldCB3b2ZmIDEyMzQKKyNlbmRpZgorCisjaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCA8IDE2MDApCisjICAgcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0Mjg0ICkgLy8gY29tcGxhaW50IGFib3V0IHJldHVybiB0eXBlIG9mIAorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yLT4gbm90IGJlZ2luIGEgVURUCisKK25hbWVzcGFjZSBib29zdCB7CituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIGVtcHR5X2Jhc2Uge307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorfSAvLyBuYW1lc3BhY2UgYm9vc3QKKworLy8gSW4gdGhpcyBzZWN0aW9uIHdlIHN1cHBseSB0aGUgeHh4eDEgYW5kIHh4eHgyIGZvcm1zIG9mIHRoZSBvcGVyYXRvcgorLy8gdGVtcGxhdGVzLCB3aGljaCBhcmUgZXhwbGljaXRseSB0YXJnZXRlZCBhdCB0aGUgMS10eXBlLWFyZ3VtZW50IGFuZAorLy8gMi10eXBlLWFyZ3VtZW50IG9wZXJhdG9yIGZvcm1zLCByZXNwZWN0aXZlbHkuIFNvbWUgY29tcGlsZXJzIGdldCBjb25mdXNlZAorLy8gd2hlbiBpbmxpbmUgZnJpZW5kIGZ1bmN0aW9ucyBhcmUgb3ZlcmxvYWRlZCBpbiBuYW1lc3BhY2VzIG90aGVyIHRoYW4gdGhlCisvLyBnbG9iYWwgbmFtZXNwYWNlLiBXaGVuIEJPT1NUX05PX09QRVJBVE9SU19JTl9OQU1FU1BBQ0UgaXMgZGVmaW5lZCwgYWxsIG9mCisvLyB0aGVzZSB0ZW1wbGF0ZXMgbXVzdCBnbyBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KKworI2lmbmRlZiBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCituYW1lc3BhY2UgYm9vc3QKK3sKKyNlbmRpZgorCisvLyAgQmFzaWMgb3BlcmF0b3IgY2xhc3NlcyAoY29udHJpYnV0ZWQgYnkgRGF2ZSBBYnJhaGFtcykgLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gIE5vdGUgdGhhdCBmcmllbmQgZnVuY3Rpb25zIGRlZmluZWQgaW4gYSBjbGFzcyBhcmUgaW1wbGljaXRseSBpbmxpbmUuCisvLyAgU2VlIHRoZSBDKysgc3RkLCAxMS40IFtjbGFzcy5mcmllbmRdIHBhcmFncmFwaCA1CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBsZXNzX3RoYW5fY29tcGFyYWJsZTIgOiBCCit7CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgVCYgeCwgY29uc3QgVSYgeSkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPiB5KTsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFQmIHgsIGNvbnN0IFUmIHkpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih4IDwgeSk7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpICB7IHJldHVybiB5IDwgeDsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgVSYgeCwgY29uc3QgVCYgeSkgIHsgcmV0dXJuIHkgPiB4OyB9CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgVSYgeCwgY29uc3QgVCYgeSkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHkgPCB4KTsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih5ID4geCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBsZXNzX3RoYW5fY29tcGFyYWJsZTEgOiBCCit7CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBUJiB4LCBjb25zdCBUJiB5KSAgeyByZXR1cm4geSA8IHg7IH0KKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeSA8IHgpOyB9CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPj0oY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPCB5KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGVxdWFsaXR5X2NvbXBhcmFibGUyIDogQgoreworICAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFUmIHksIGNvbnN0IFQmIHgpIHsgcmV0dXJuIHggPT0geTsgfQorICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFUmIHksIGNvbnN0IFQmIHgpIHsgcmV0dXJuICFzdGF0aWNfY2FzdDxib29sPih4ID09IHkpOyB9CisgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYgeSwgY29uc3QgVSYgeCkgeyByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHkgPT0geCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBlcXVhbGl0eV9jb21wYXJhYmxlMSA6IEIKK3sKKyAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7IHJldHVybiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeCA9PSB5KTsgfQorfTsKKworLy8gQSBtYWNybyB3aGljaCBwcm9kdWNlcyAibmFtZV8ybGVmdCIgZnJvbSAibmFtZSIuCisjZGVmaW5lIEJPT1NUX09QRVJBVE9SMl9MRUZUKG5hbWUpIG5hbWUjIzIjI18jI2xlZnQKKworLy8gIE5SVk8tZnJpZW5kbHkgaW1wbGVtZW50YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IERhbmllbCBGcmV5KSAtLS0tLS0tLS0tLS0tLS0vLworCisjaWYgZGVmaW5lZChCT09TVF9IQVNfTlJWTykgfHwgZGVmaW5lZChCT09TVF9GT1JDRV9TWU1NRVRSSUNfT1BFUkFUT1JTKQorCisvLyBUaGlzIGlzIHRoZSBvcHRpbWFsIGltcGxlbWVudGF0aW9uIGZvciBJU08vQU5TSSBDKyssCisvLyBidXQgaXQgcmVxdWlyZXMgdGhlIGNvbXBpbGVyIHRvIGltcGxlbWVudCB0aGUgTlJWTy4KKy8vIElmIHRoZSBjb21waWxlciBoYXMgbm8gTlJWTywgdGhpcyBpcyB0aGUgYmVzdCBzeW1tZXRyaWMKKy8vIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZS4KKworI2RlZmluZSBCT09TVF9CSU5BUllfT1BFUkFUT1JfQ09NTVVUQVRJVkUoIE5BTUUsIE9QICkgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgXAorc3RydWN0IE5BTUUjIzIgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVSYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIHJocyApOyBucnYgT1AjIz0gbGhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgICAgICAgICAgXAorc3RydWN0IE5BTUUjIzEgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsKKworI2RlZmluZSBCT09TVF9CSU5BUllfT1BFUkFUT1JfTk9OX0NPTU1VVEFUSVZFKCBOQU1FLCBPUCApICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgXAorc3RydWN0IE5BTUUjIzIgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBVJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgXAorc3RydWN0IEJPT1NUX09QRVJBVE9SMl9MRUZUKE5BTUUpIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVSYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgICAgXAorc3RydWN0IE5BTUUjIzEgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgVCBucnYoIGxocyApOyBucnYgT1AjIz0gcmhzOyByZXR1cm4gbnJ2OyB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsKKworI2Vsc2UgLy8gZGVmaW5lZChCT09TVF9IQVNfTlJWTykgfHwgZGVmaW5lZChCT09TVF9GT1JDRV9TWU1NRVRSSUNfT1BFUkFUT1JTKQorCisvLyBGb3IgY29tcGlsZXJzIHdpdGhvdXQgTlJWTyB0aGUgZm9sbG93aW5nIGNvZGUgaXMgb3B0aW1hbCwgYnV0IG5vdAorLy8gc3ltbWV0cmljISAgTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorLy8gQk9PU1RfT1BFUkFUT1IyX0xFRlQoTkFNRSkgb25seSBsb29rcyBjb29sLCBidXQgZG9lc24ndCBwcm92aWRlCisvLyBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyB0byB0aGUgY29tcGlsZXIgOikKKworI2RlZmluZSBCT09TVF9CSU5BUllfT1BFUkFUT1JfQ09NTVVUQVRJVkUoIE5BTUUsIE9QICkgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgXAorc3RydWN0IE5BTUUjIzIgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggVCBsaHMsIGNvbnN0IFUmIHJocyApIHsgcmV0dXJuIGxocyBPUCMjPSByaHM7IH0gXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVSYgbGhzLCBUIHJocyApIHsgcmV0dXJuIHJocyBPUCMjPSBsaHM7IH0gXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgICAgXAorc3RydWN0IE5BTUUjIzEgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggVCBsaHMsIGNvbnN0IFQmIHJocyApIHsgcmV0dXJuIGxocyBPUCMjPSByaHM7IH0gXAorfTsKKworI2RlZmluZSBCT09TVF9CSU5BUllfT1BFUkFUT1JfTk9OX0NPTU1VVEFUSVZFKCBOQU1FLCBPUCApICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgXAorc3RydWN0IE5BTUUjIzIgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggVCBsaHMsIGNvbnN0IFUmIHJocyApIHsgcmV0dXJuIGxocyBPUCMjPSByaHM7IH0gXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgXAorc3RydWN0IEJPT1NUX09QRVJBVE9SMl9MRUZUKE5BTUUpIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggY29uc3QgVSYgbGhzLCBjb25zdCBUJiByaHMgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgcmV0dXJuIFQoIGxocyApIE9QIyM9IHJoczsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiAgICAgICAgICAgXAorc3RydWN0IE5BTUUjIzEgOiBCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmcmllbmQgVCBvcGVyYXRvciBPUCggVCBsaHMsIGNvbnN0IFQmIHJocyApIHsgcmV0dXJuIGxocyBPUCMjPSByaHM7IH0gXAorfTsKKworI2VuZGlmIC8vIGRlZmluZWQoQk9PU1RfSEFTX05SVk8pIHx8IGRlZmluZWQoQk9PU1RfRk9SQ0VfU1lNTUVUUklDX09QRVJBVE9SUykKKworQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCBtdWx0aXBsaWFibGUsICogKQorQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCBhZGRhYmxlLCArICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9OT05fQ09NTVVUQVRJVkUoIHN1YnRyYWN0YWJsZSwgLSApCitCT09TVF9CSU5BUllfT1BFUkFUT1JfTk9OX0NPTU1VVEFUSVZFKCBkaXZpZGFibGUsIC8gKQorQk9PU1RfQklOQVJZX09QRVJBVE9SX05PTl9DT01NVVRBVElWRSggbW9kYWJsZSwgJSApCitCT09TVF9CSU5BUllfT1BFUkFUT1JfQ09NTVVUQVRJVkUoIHhvcmFibGUsIF4gKQorQk9PU1RfQklOQVJZX09QRVJBVE9SX0NPTU1VVEFUSVZFKCBhbmRhYmxlLCAmICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUl9DT01NVVRBVElWRSggb3JhYmxlLCB8ICkKKworI3VuZGVmIEJPT1NUX0JJTkFSWV9PUEVSQVRPUl9DT01NVVRBVElWRQorI3VuZGVmIEJPT1NUX0JJTkFSWV9PUEVSQVRPUl9OT05fQ09NTVVUQVRJVkUKKyN1bmRlZiBCT09TVF9PUEVSQVRPUjJfTEVGVAorCisvLyAgaW5jcmVtZW50YWJsZSBhbmQgZGVjcmVtZW50YWJsZSBjb250cmlidXRlZCBieSBKZXJlbXkgU2llaworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgaW5jcmVtZW50YWJsZSA6IEIKK3sKKyAgZnJpZW5kIFQgb3BlcmF0b3IrKyhUJiB4LCBpbnQpCisgIHsKKyAgICBpbmNyZW1lbnRhYmxlX3R5cGUgbnJ2KHgpOworICAgICsreDsKKyAgICByZXR1cm4gbnJ2OworICB9Citwcml2YXRlOiAvLyBUaGUgdXNlIG9mIHRoaXMgdHlwZWRlZiB3b3JrcyBhcm91bmQgYSBCb3JsYW5kIGJ1ZworICB0eXBlZGVmIFQgaW5jcmVtZW50YWJsZV90eXBlOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGRlY3JlbWVudGFibGUgOiBCCit7CisgIGZyaWVuZCBUIG9wZXJhdG9yLS0oVCYgeCwgaW50KQorICB7CisgICAgZGVjcmVtZW50YWJsZV90eXBlIG5ydih4KTsKKyAgICAtLXg7CisgICAgcmV0dXJuIG5ydjsKKyAgfQorcHJpdmF0ZTogLy8gVGhlIHVzZSBvZiB0aGlzIHR5cGVkZWYgd29ya3MgYXJvdW5kIGEgQm9ybGFuZCBidWcKKyAgdHlwZWRlZiBUIGRlY3JlbWVudGFibGVfdHlwZTsKK307CisKKy8vICBJdGVyYXRvciBvcGVyYXRvciBjbGFzc2VzIChjb250cmlidXRlZCBieSBKZXJlbXkgU2llaykgLS0tLS0tLS0tLS0tLS0tLS0tLy8KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGRlcmVmZXJlbmNlYWJsZSA6IEIKK3sKKyAgUCBvcGVyYXRvci0+KCkgY29uc3QKKyAgeyAKKyAgICByZXR1cm4gJipzdGF0aWNfY2FzdDxjb25zdCBUJj4oKnRoaXMpOyAKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEksIGNsYXNzIFIsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGluZGV4YWJsZSA6IEIKK3sKKyAgUiBvcGVyYXRvcltdKEkgbikgY29uc3QKKyAgeworICAgIHJldHVybiAqKHN0YXRpY19jYXN0PGNvbnN0IFQmPigqdGhpcykgKyBuKTsKKyAgfQorfTsKKworLy8gIE1vcmUgb3BlcmF0b3IgY2xhc3NlcyAoY29udHJpYnV0ZWQgYnkgRGFyeWxlIFdhbGtlcikgLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworLy8gIChOUlZPLWZyaWVuZGx5IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IERhbmllbCBGcmV5KSAtLS0tLS0tLS0tLS0tLS0vLworCisjaWYgZGVmaW5lZChCT09TVF9IQVNfTlJWTykgfHwgZGVmaW5lZChCT09TVF9GT1JDRV9TWU1NRVRSSUNfT1BFUkFUT1JTKQorCisjZGVmaW5lIEJPT1NUX0JJTkFSWV9PUEVSQVRPUiggTkFNRSwgT1AgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICBcCitzdHJ1Y3QgTkFNRSMjMiA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZyaWVuZCBUIG9wZXJhdG9yIE9QKCBjb25zdCBUJiBsaHMsIGNvbnN0IFUmIHJocyApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBUIG5ydiggbGhzICk7IG5ydiBPUCMjPSByaHM7IHJldHVybiBucnY7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+ICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgTkFNRSMjMSA6IEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZyaWVuZCBUIG9wZXJhdG9yIE9QKCBjb25zdCBUJiBsaHMsIGNvbnN0IFQmIHJocyApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBUIG5ydiggbGhzICk7IG5ydiBPUCMjPSByaHM7IHJldHVybiBucnY7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCisjZWxzZSAvLyBkZWZpbmVkKEJPT1NUX0hBU19OUlZPKSB8fCBkZWZpbmVkKEJPT1NUX0ZPUkNFX1NZTU1FVFJJQ19PUEVSQVRPUlMpCisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX09QRVJBVE9SKCBOQU1FLCBPUCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4gICAgICAgIFwKK3N0cnVjdCBOQU1FIyMyIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBVJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9ICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4gICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBOQU1FIyMxIDogQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZnJpZW5kIFQgb3BlcmF0b3IgT1AoIFQgbGhzLCBjb25zdCBUJiByaHMgKSB7IHJldHVybiBsaHMgT1AjIz0gcmhzOyB9ICAgICAgIFwKK307CisKKyNlbmRpZiAvLyBkZWZpbmVkKEJPT1NUX0hBU19OUlZPKSB8fCBkZWZpbmVkKEJPT1NUX0ZPUkNFX1NZTU1FVFJJQ19PUEVSQVRPUlMpCisKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUiggbGVmdF9zaGlmdGFibGUsIDw8ICkKK0JPT1NUX0JJTkFSWV9PUEVSQVRPUiggcmlnaHRfc2hpZnRhYmxlLCA+PiApCisKKyN1bmRlZiBCT09TVF9CSU5BUllfT1BFUkFUT1IKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGVxdWl2YWxlbnQyIDogQgoreworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQmIHgsIGNvbnN0IFUmIHkpCisgIHsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPCB5KSAmJiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeCA+IHkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZXF1aXZhbGVudDEgOiBCCit7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVCZ4LCBjb25zdCBUJnkpCisgIHsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGJvb2w+KHggPCB5KSAmJiAhc3RhdGljX2Nhc3Q8Ym9vbD4oeSA8IHgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgcGFydGlhbGx5X29yZGVyZWQyIDogQgoreworICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFQmIHgsIGNvbnN0IFUmIHkpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oeCA8IHkpIHx8IHN0YXRpY19jYXN0PGJvb2w+KHggPT0geSk7IH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBUJiB4LCBjb25zdCBVJiB5KQorICAgIHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHggPiB5KSB8fCBzdGF0aWNfY2FzdDxib29sPih4ID09IHkpOyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBVJiB4LCBjb25zdCBUJiB5KQorICAgIHsgcmV0dXJuIHkgPCB4OyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBVJiB4LCBjb25zdCBUJiB5KQorICAgIHsgcmV0dXJuIHkgPiB4OyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgVSYgeCwgY29uc3QgVCYgeSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPih5ID4geCkgfHwgc3RhdGljX2Nhc3Q8Ym9vbD4oeSA9PSB4KTsgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFUmIHgsIGNvbnN0IFQmIHkpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oeSA8IHgpIHx8IHN0YXRpY19jYXN0PGJvb2w+KHkgPT0geCk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBwYXJ0aWFsbHlfb3JkZXJlZDEgOiBCCit7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBUJiB4LCBjb25zdCBUJiB5KQorICAgIHsgcmV0dXJuIHkgPCB4OyB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgVCYgeCwgY29uc3QgVCYgeSkKKyAgICB7IHJldHVybiBzdGF0aWNfY2FzdDxib29sPih4IDwgeSkgfHwgc3RhdGljX2Nhc3Q8Ym9vbD4oeCA9PSB5KTsgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFQmIHgsIGNvbnN0IFQmIHkpCisgICAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8Ym9vbD4oeSA8IHgpIHx8IHN0YXRpY19jYXN0PGJvb2w+KHggPT0geSk7IH0KK307CisKKy8vICBDb21iaW5lZCBvcGVyYXRvciBjbGFzc2VzIChjb250cmlidXRlZCBieSBEYXJ5bGUgV2Fsa2VyKSAtLS0tLS0tLS0tLS0tLS0tLy8KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHRvdGFsbHlfb3JkZXJlZDIKKyAgICA6IGxlc3NfdGhhbl9jb21wYXJhYmxlMjxULCBVCisgICAgLCBlcXVhbGl0eV9jb21wYXJhYmxlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCB0b3RhbGx5X29yZGVyZWQxCisgICAgOiBsZXNzX3RoYW5fY29tcGFyYWJsZTE8VAorICAgICwgZXF1YWxpdHlfY29tcGFyYWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgYWRkaXRpdmUyCisgICAgOiBhZGRhYmxlMjxULCBVCisgICAgLCBzdWJ0cmFjdGFibGUyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGFkZGl0aXZlMQorICAgIDogYWRkYWJsZTE8VAorICAgICwgc3VidHJhY3RhYmxlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBtdWx0aXBsaWNhdGl2ZTIKKyAgICA6IG11bHRpcGxpYWJsZTI8VCwgVQorICAgICwgZGl2aWRhYmxlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBtdWx0aXBsaWNhdGl2ZTEKKyAgICA6IG11bHRpcGxpYWJsZTE8VAorICAgICwgZGl2aWRhYmxlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBpbnRlZ2VyX211bHRpcGxpY2F0aXZlMgorICAgIDogbXVsdGlwbGljYXRpdmUyPFQsIFUKKyAgICAsIG1vZGFibGUyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGludGVnZXJfbXVsdGlwbGljYXRpdmUxCisgICAgOiBtdWx0aXBsaWNhdGl2ZTE8VAorICAgICwgbW9kYWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgYXJpdGhtZXRpYzIKKyAgICA6IGFkZGl0aXZlMjxULCBVCisgICAgLCBtdWx0aXBsaWNhdGl2ZTI8VCwgVSwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgYXJpdGhtZXRpYzEKKyAgICA6IGFkZGl0aXZlMTxUCisgICAgLCBtdWx0aXBsaWNhdGl2ZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgaW50ZWdlcl9hcml0aG1ldGljMgorICAgIDogYWRkaXRpdmUyPFQsIFUKKyAgICAsIGludGVnZXJfbXVsdGlwbGljYXRpdmUyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGludGVnZXJfYXJpdGhtZXRpYzEKKyAgICA6IGFkZGl0aXZlMTxUCisgICAgLCBpbnRlZ2VyX211bHRpcGxpY2F0aXZlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBiaXR3aXNlMgorICAgIDogeG9yYWJsZTI8VCwgVQorICAgICwgYW5kYWJsZTI8VCwgVQorICAgICwgb3JhYmxlMjxULCBVLCBCCisgICAgICA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGJpdHdpc2UxCisgICAgOiB4b3JhYmxlMTxUCisgICAgLCBhbmRhYmxlMTxUCisgICAgLCBvcmFibGUxPFQsIEIKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgdW5pdF9zdGVwcGFibGUKKyAgICA6IGluY3JlbWVudGFibGU8VAorICAgICwgZGVjcmVtZW50YWJsZTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBzaGlmdGFibGUyCisgICAgOiBsZWZ0X3NoaWZ0YWJsZTI8VCwgVQorICAgICwgcmlnaHRfc2hpZnRhYmxlMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBzaGlmdGFibGUxCisgICAgOiBsZWZ0X3NoaWZ0YWJsZTE8VAorICAgICwgcmlnaHRfc2hpZnRhYmxlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCByaW5nX29wZXJhdG9yczIKKyAgICA6IGFkZGl0aXZlMjxULCBVCisgICAgLCBzdWJ0cmFjdGFibGUyX2xlZnQ8VCwgVQorICAgICwgbXVsdGlwbGlhYmxlMjxULCBVLCBCCisgICAgICA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHJpbmdfb3BlcmF0b3JzMQorICAgIDogYWRkaXRpdmUxPFQKKyAgICAsIG11bHRpcGxpYWJsZTE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgb3JkZXJlZF9yaW5nX29wZXJhdG9yczIKKyAgICA6IHJpbmdfb3BlcmF0b3JzMjxULCBVCisgICAgLCB0b3RhbGx5X29yZGVyZWQyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfcmluZ19vcGVyYXRvcnMxCisgICAgOiByaW5nX29wZXJhdG9yczE8VAorICAgICwgdG90YWxseV9vcmRlcmVkMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBmaWVsZF9vcGVyYXRvcnMyCisgICAgOiByaW5nX29wZXJhdG9yczI8VCwgVQorICAgICwgZGl2aWRhYmxlMjxULCBVCisgICAgLCBkaXZpZGFibGUyX2xlZnQ8VCwgVSwgQgorICAgICAgPiA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBmaWVsZF9vcGVyYXRvcnMxCisgICAgOiByaW5nX29wZXJhdG9yczE8VAorICAgICwgZGl2aWRhYmxlMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvcmRlcmVkX2ZpZWxkX29wZXJhdG9yczIKKyAgICA6IGZpZWxkX29wZXJhdG9yczI8VCwgVQorICAgICwgdG90YWxseV9vcmRlcmVkMjxULCBVLCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvcmRlcmVkX2ZpZWxkX29wZXJhdG9yczEKKyAgICA6IGZpZWxkX29wZXJhdG9yczE8VAorICAgICwgdG90YWxseV9vcmRlcmVkMTxULCBCCisgICAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMyCisgICAgOiByaW5nX29wZXJhdG9yczI8VCwgVQorICAgICwgZGl2aWRhYmxlMjxULCBVCisgICAgLCBkaXZpZGFibGUyX2xlZnQ8VCwgVQorICAgICwgbW9kYWJsZTI8VCwgVQorICAgICwgbW9kYWJsZTJfbGVmdDxULCBVLCBCCisgICAgICA+ID4gPiA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMxCisgICAgOiByaW5nX29wZXJhdG9yczE8VAorICAgICwgZGl2aWRhYmxlMTxUCisgICAgLCBtb2RhYmxlMTxULCBCCisgICAgICA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMgorICAgIDogdG90YWxseV9vcmRlcmVkMjxULCBVCisgICAgLCBldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMyPFQsIFUsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IG9yZGVyZWRfZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzMQorICAgIDogdG90YWxseV9vcmRlcmVkMTxUCisgICAgLCBldWNsaWRpYW5fcmluZ19vcGVyYXRvcnMxPFQsIEIKKyAgICAgID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczIKKyAgICA6IHJpbmdfb3BlcmF0b3JzMjxULCBVCisgICAgLCBkaXZpZGFibGUyPFQsIFUKKyAgICAsIGRpdmlkYWJsZTJfbGVmdDxULCBVCisgICAgLCBtb2RhYmxlMjxULCBVCisgICAgLCBtb2RhYmxlMl9sZWZ0PFQsIFUsIEIKKyAgICAgID4gPiA+ID4gPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IGV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczEKKyAgICA6IHJpbmdfb3BlcmF0b3JzMTxUCisgICAgLCBkaXZpZGFibGUxPFQKKyAgICAsIG1vZGFibGUxPFQsIEIKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgb3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMyCisgICAgOiB0b3RhbGx5X29yZGVyZWQyPFQsIFUKKyAgICAsIGV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczI8VCwgVSwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3Qgb3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMxCisgICAgOiB0b3RhbGx5X29yZGVyZWQxPFQKKyAgICAsIGV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczE8VCwgQgorICAgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgUCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgaW5wdXRfaXRlcmF0YWJsZQorICAgIDogZXF1YWxpdHlfY29tcGFyYWJsZTE8VAorICAgICwgaW5jcmVtZW50YWJsZTxUCisgICAgLCBkZXJlZmVyZW5jZWFibGU8VCwgUCwgQgorICAgICAgPiA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBvdXRwdXRfaXRlcmF0YWJsZQorICAgIDogaW5jcmVtZW50YWJsZTxULCBCCisgICAgICA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgUCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+CitzdHJ1Y3QgZm9yd2FyZF9pdGVyYXRhYmxlCisgICAgOiBpbnB1dF9pdGVyYXRhYmxlPFQsIFAsIEIKKyAgICAgID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBQLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4KK3N0cnVjdCBiaWRpcmVjdGlvbmFsX2l0ZXJhdGFibGUKKyAgICA6IGZvcndhcmRfaXRlcmF0YWJsZTxULCBQCisgICAgLCBkZWNyZW1lbnRhYmxlPFQsIEIKKyAgICAgID4gPiB7fTsKKworLy8gIFRvIGF2b2lkIHJlcGVhdGVkIGRlcml2YXRpb24gZnJvbSBlcXVhbGl0eV9jb21wYXJhYmxlLAorLy8gIHdoaWNoIGlzIGFuIGluZGlyZWN0IGJhc2UgY2xhc3Mgb2YgYmlkaXJlY3Rpb25hbF9pdGVyYWJsZSwKKy8vICByYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUgbXVzdCBub3QgYmUgZGVyaXZlZCBmcm9tIHRvdGFsbHlfb3JkZXJlZDEKKy8vICBidXQgZnJvbSBsZXNzX3RoYW5fY29tcGFyYWJsZTEgb25seS4gKEhlbG11dCBaZWlzZWwsIDAyLURlYy0yMDAxKQordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFAsIGNsYXNzIEQsIGNsYXNzIFIsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPgorc3RydWN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0YWJsZQorICAgIDogYmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlPFQsIFAKKyAgICAsIGxlc3NfdGhhbl9jb21wYXJhYmxlMTxUCisgICAgLCBhZGRpdGl2ZTI8VCwgRAorICAgICwgaW5kZXhhYmxlPFQsIEQsIFIsIEIKKyAgICAgID4gPiA+ID4ge307CisKKyNpZm5kZWYgQk9PU1RfTk9fT1BFUkFUT1JTX0lOX05BTUVTUEFDRQorfSAvLyBuYW1lc3BhY2UgYm9vc3QKKyNlbmRpZiAvLyBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCisKKworLy8gQk9PU1RfSU1QT1JUX1RFTVBMQVRFMSAuLiBCT09TVF9JTVBPUlRfVEVNUExBVEU0IC0KKy8vCisvLyBXaGVuIEJPT1NUX05PX09QRVJBVE9SU19JTl9OQU1FU1BBQ0UgaXMgZGVmaW5lZCB3ZSBuZWVkIGEgd2F5IHRvIGltcG9ydCBhbgorLy8gb3BlcmF0b3IgdGVtcGxhdGUgaW50byB0aGUgYm9vc3QgbmFtZXNwYWNlLiBCT09TVF9JTVBPUlRfVEVNUExBVEUxIGlzIHVzZWQKKy8vIGZvciBvbmUtYXJndW1lbnQgZm9ybXMgb2Ygb3BlcmF0b3IgdGVtcGxhdGVzOyBCT09TVF9JTVBPUlRfVEVNUExBVEUyIGZvcgorLy8gdHdvLWFyZ3VtZW50IGZvcm1zLiBOb3RlIHRoYXQgdGhlc2UgbWFjcm9zIGV4cGVjdCB0byBiZSBpbnZva2VkIGZyb20gd2l0aGluCisvLyBib29zdC4KKworI2lmbmRlZiBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCisKKyAgLy8gVGhlIHRlbXBsYXRlIGlzIGFscmVhZHkgaW4gYm9vc3Qgc28gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLgorIyBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFNCh0ZW1wbGF0ZV9uYW1lKQorIyBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMyh0ZW1wbGF0ZV9uYW1lKQorIyBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMih0ZW1wbGF0ZV9uYW1lKQorIyBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMSh0ZW1wbGF0ZV9uYW1lKQorCisjZWxzZSAvLyBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCisKKyMgIGlmbmRlZiBCT09TVF9OT19VU0lOR19URU1QTEFURQorCisgICAgIC8vIEJyaW5nIHRoZSBuYW1lcyBpbiB3aXRoIGEgdXNpbmctZGVjbGFyYXRpb24KKyAgICAgLy8gdG8gYXZvaWQgc3RyZXNzaW5nIHRoZSBjb21waWxlci4KKyMgICAgZGVmaW5lIEJPT1NUX0lNUE9SVF9URU1QTEFURTQodGVtcGxhdGVfbmFtZSkgdXNpbmcgOjp0ZW1wbGF0ZV9uYW1lOworIyAgICBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMyh0ZW1wbGF0ZV9uYW1lKSB1c2luZyA6OnRlbXBsYXRlX25hbWU7CisjICAgIGRlZmluZSBCT09TVF9JTVBPUlRfVEVNUExBVEUyKHRlbXBsYXRlX25hbWUpIHVzaW5nIDo6dGVtcGxhdGVfbmFtZTsKKyMgICAgZGVmaW5lIEJPT1NUX0lNUE9SVF9URU1QTEFURTEodGVtcGxhdGVfbmFtZSkgdXNpbmcgOjp0ZW1wbGF0ZV9uYW1lOworCisjICBlbHNlCisKKyAgICAgLy8gT3RoZXJ3aXNlLCBiZWNhdXNlIGEgQm9ybGFuZCBDKysgNS41IGJ1ZyBwcmV2ZW50cyBhIHVzaW5nIGRlY2xhcmF0aW9uCisgICAgIC8vIGZyb20gd29ya2luZywgd2UgYXJlIGZvcmNlZCB0byB1c2UgaW5oZXJpdGFuY2UgZm9yIHRoYXQgY29tcGlsZXIuCisjICAgIGRlZmluZSBCT09TVF9JTVBPUlRfVEVNUExBVEU0KHRlbXBsYXRlX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSwgY2xhc3MgViwgY2xhc3MgVywgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKKyAgICAgc3RydWN0IHRlbXBsYXRlX25hbWUgOiA6OnRlbXBsYXRlX25hbWU8VCwgVSwgViwgVywgQj4ge307CisKKyMgICAgZGVmaW5lIEJPT1NUX0lNUE9SVF9URU1QTEFURTModGVtcGxhdGVfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBCID0gOjpib29zdDo6ZGV0YWlsOjplbXB0eV9iYXNlPFQ+ID4gXAorICAgICBzdHJ1Y3QgdGVtcGxhdGVfbmFtZSA6IDo6dGVtcGxhdGVfbmFtZTxULCBVLCBWLCBCPiB7fTsKKworIyAgICBkZWZpbmUgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMih0ZW1wbGF0ZV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gPiBcCisgICAgIHN0cnVjdCB0ZW1wbGF0ZV9uYW1lIDogOjp0ZW1wbGF0ZV9uYW1lPFQsIFUsIEI+IHt9OworCisjICAgIGRlZmluZSBCT09TVF9JTVBPUlRfVEVNUExBVEUxKHRlbXBsYXRlX25hbWUpICAgICAgICAgICAgICAgICAgXAorICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQiA9IDo6Ym9vc3Q6OmRldGFpbDo6ZW1wdHlfYmFzZTxUPiA+IFwKKyAgICAgc3RydWN0IHRlbXBsYXRlX25hbWUgOiA6OnRlbXBsYXRlX25hbWU8VCwgQj4ge307CisKKyMgIGVuZGlmIC8vIEJPT1NUX05PX1VTSU5HX1RFTVBMQVRFCisKKyNlbmRpZiAvLyBCT09TVF9OT19PUEVSQVRPUlNfSU5fTkFNRVNQQUNFCisKKy8vCisvLyBIZXJlJ3Mgd2hlcmUgd2UgcHV0IGl0IGFsbCB0b2dldGhlciwgZGVmaW5pbmcgdGhlIHh4eHggZm9ybXMgb2YgdGhlIHRlbXBsYXRlcworLy8gaW4gbmFtZXNwYWNlIGJvb3N0LiBXZSBhbHNvIGRlZmluZSBzcGVjaWFsaXphdGlvbnMgb2YgaXNfY2hhaW5lZF9iYXNlPD4gZm9yCisvLyB0aGUgeHh4eCwgeHh4eDEsIGFuZCB4eHh4MiB0ZW1wbGF0ZXMsIGltcG9ydGluZyB0aGVtIGludG8gYm9vc3Q6OiBhcworLy8gbmVjZXNzYXJ5LgorLy8KKworLy8gaXNfY2hhaW5lZF9iYXNlPD4gLSBhIHRyYWl0cyBjbGFzcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHdoZXRoZXIgYW4gb3BlcmF0b3IKKy8vIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGJlaW5nIHVzZWQgZm9yIGJhc2UgY2xhc3MgY2hhaW5pbmcsIG9yIGlzIHNwZWNpZnlpbmcgYQorLy8gMm5kIGFyZ3VtZW50IHR5cGUuCisKK25hbWVzcGFjZSBib29zdCB7CisvLyBBIHR5cGUgcGFyYW1ldGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHBsYWluIGJvb2wgYmVjYXVzZSBCb3JsYW5kJ3MgY29tcGlsZXIKKy8vIGRpZG4ndCBjb3BlIHdlbGwgd2l0aCB0aGUgbW9yZSBvYnZpb3VzIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlci4KK25hbWVzcGFjZSBkZXRhaWwgeworICBzdHJ1Y3QgdHJ1ZV90IHt9OworICBzdHJ1Y3QgZmFsc2VfdCB7fTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLyBVbnNwZWNpYWxpemVkIHZlcnNpb24gYXNzdW1lcyB0aGF0IG1vc3QgdHlwZXMgYXJlIG5vdCBiZWluZyB1c2VkIGZvciBiYXNlCisvLyBjbGFzcyBjaGFpbmluZy4gV2Ugc3BlY2lhbGl6ZSBmb3IgdGhlIG9wZXJhdG9yIHRlbXBsYXRlcyBkZWZpbmVkIGluIHRoaXMKKy8vIGxpYnJhcnkuCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgaXNfY2hhaW5lZF9iYXNlIHsKKyAgdHlwZWRlZiA6OmJvb3N0OjpkZXRhaWw6OmZhbHNlX3QgdmFsdWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisvLyBJbXBvcnQgYSA0LXR5cGUtYXJndW1lbnQgb3BlcmF0b3IgdGVtcGxhdGUgaW50byBib29zdCAoaWYgbmVjZXNzYXJ5KSBhbmQKKy8vIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbiBvZiAnaXNfY2hhaW5lZF9iYXNlPD4nIGZvciBpdC4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFNCh0ZW1wbGF0ZV9uYW1lNCkgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0lNUE9SVF9URU1QTEFURTQodGVtcGxhdGVfbmFtZTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBXLCBjbGFzcyBCPiAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgOjpib29zdDo6dGVtcGxhdGVfbmFtZTQ8VCwgVSwgViwgVywgQj4gPiB7ICBcCisgICAgdHlwZWRlZiA6OmJvb3N0OjpkZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisvLyBJbXBvcnQgYSAzLXR5cGUtYXJndW1lbnQgb3BlcmF0b3IgdGVtcGxhdGUgaW50byBib29zdCAoaWYgbmVjZXNzYXJ5KSBhbmQKKy8vIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbiBvZiAnaXNfY2hhaW5lZF9iYXNlPD4nIGZvciBpdC4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMyh0ZW1wbGF0ZV9uYW1lMykgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0lNUE9SVF9URU1QTEFURTModGVtcGxhdGVfbmFtZTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgOjpib29zdDo6dGVtcGxhdGVfbmFtZTM8VCwgVSwgViwgQj4gPiB7ICAgICBcCisgICAgdHlwZWRlZiA6OmJvb3N0OjpkZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisvLyBJbXBvcnQgYSAyLXR5cGUtYXJndW1lbnQgb3BlcmF0b3IgdGVtcGxhdGUgaW50byBib29zdCAoaWYgbmVjZXNzYXJ5KSBhbmQKKy8vIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbiBvZiAnaXNfY2hhaW5lZF9iYXNlPD4nIGZvciBpdC4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMih0ZW1wbGF0ZV9uYW1lMikgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0lNUE9SVF9URU1QTEFURTIodGVtcGxhdGVfbmFtZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgOjpib29zdDo6dGVtcGxhdGVfbmFtZTI8VCwgVSwgQj4gPiB7ICAgICBcCisgICAgdHlwZWRlZiA6OmJvb3N0OjpkZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisvLyBJbXBvcnQgYSAxLXR5cGUtYXJndW1lbnQgb3BlcmF0b3IgdGVtcGxhdGUgaW50byBib29zdCAoaWYgbmVjZXNzYXJ5KSBhbmQKKy8vIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbiBvZiAnaXNfY2hhaW5lZF9iYXNlPD4nIGZvciBpdC4KKyMgZGVmaW5lIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFMSh0ZW1wbGF0ZV9uYW1lMSkgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0lNUE9SVF9URU1QTEFURTEodGVtcGxhdGVfbmFtZTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IGlzX2NoYWluZWRfYmFzZTwgOjpib29zdDo6dGVtcGxhdGVfbmFtZTE8VCwgQj4gPiB7ICAgICAgICBcCisgICAgdHlwZWRlZiA6OmJvb3N0OjpkZXRhaWw6OnRydWVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OworCisvLyBCT09TVF9PUEVSQVRPUl9URU1QTEFURSh0ZW1wbGF0ZV9uYW1lKSBkZWZpbmVzIHRlbXBsYXRlX25hbWU8PiBzdWNoIHRoYXQgaXQKKy8vIGNhbiBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIGJvdGggMS1hcmd1bWVudCBhbmQgMi1hcmd1bWVudCBmb3Jtcy4gUmVxdWlyZXMgdGhlCisvLyBleGlzdGVuY2Ugb2YgdHdvIHByZXZpb3VzbHkgZGVmaW5lZCBjbGFzcyB0ZW1wbGF0ZXMgbmFtZWQgJzx0ZW1wbGF0ZV9uYW1lPjEnCisvLyBhbmQgJzx0ZW1wbGF0ZV9uYW1lPjInIHdoaWNoIG11c3QgaW1wbGVtZW50IHRoZSBjb3JyZXNwb25kaW5nIDEtIGFuZCAyLQorLy8gYXJndW1lbnQgZm9ybXMuCisvLworLy8gVGhlIHRlbXBsYXRlIHR5cGUgcGFyYW1ldGVyIE8gPT0gaXNfY2hhaW5lZF9iYXNlPFU+Ojp2YWx1ZSBpcyB1c2VkIHRvCisvLyBkaXN0aW5ndWlzaCB3aGV0aGVyIHRoZSAybmQgYXJndW1lbnQgdG8gPHRlbXBsYXRlX25hbWU+IGlzIGJlaW5nIHVzZWQgZm9yCisvLyBiYXNlIGNsYXNzIGNoYWluaW5nIGZyb20gYW5vdGhlciBib29zdCBvcGVyYXRvciB0ZW1wbGF0ZSBvciBpcyBkZXNjcmliaW5nIGEKKy8vIDJuZCBvcGVyYW5kIHR5cGUuIE8gPT0gdHJ1ZV90IG9ubHkgd2hlbiBVIGlzIGFjdHVhbGx5IGFuIGFub3RoZXIgb3BlcmF0b3IKKy8vIHRlbXBsYXRlIGZyb20gdGhlIGxpYnJhcnkuIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYW4KKy8vIGltcGxlbWVudGF0aW9uIGluIHRlcm1zIG9mIGVpdGhlciAnPHRlbXBsYXRlX25hbWU+MScgb3IgJzx0ZW1wbGF0ZV9uYW1lPjInLgorLy8KKworIyBkZWZpbmUgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUodGVtcGxhdGVfbmFtZSkgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlIDxjbGFzcyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAsY2xhc3MgVSA9IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgLGNsYXNzIEIgPSA6OmJvb3N0OjpkZXRhaWw6OmVtcHR5X2Jhc2U8VD4gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICxjbGFzcyBPID0gdHlwZW5hbWUgaXNfY2hhaW5lZF9iYXNlPFU+Ojp2YWx1ZSAgICAgICAgICAgICBcCisgICAgICAgICA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHRlbXBsYXRlX25hbWUgOiB0ZW1wbGF0ZV9uYW1lIyMyPFQsIFUsIEI+IHt9OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHRlbXBsYXRlX25hbWU8VCwgVSwgQiwgOjpib29zdDo6ZGV0YWlsOjp0cnVlX3Q+ICAgICAgICAgICAgIFwKKyAgOiB0ZW1wbGF0ZV9uYW1lIyMxPFQsIFU+IHt9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCB0ZW1wbGF0ZV9uYW1lPFQsIFQsIEIsIDo6Ym9vc3Q6OmRldGFpbDo6ZmFsc2VfdD4gICAgICAgICAgICBcCisgIDogdGVtcGxhdGVfbmFtZSMjMTxULCBCPiB7fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFUsIGNsYXNzIEIsIGNsYXNzIE8+ICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgaXNfY2hhaW5lZF9iYXNlPCA6OmJvb3N0Ojp0ZW1wbGF0ZV9uYW1lPFQsIFUsIEIsIE8+ID4geyAgICAgXAorICB0eXBlZGVmIDo6Ym9vc3Q6OmRldGFpbDo6dHJ1ZV90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUyKHRlbXBsYXRlX25hbWUjIzIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMSh0ZW1wbGF0ZV9uYW1lIyMxKQorCisKKworbmFtZXNwYWNlIGJvb3N0IHsKKyAgICAKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGxlc3NfdGhhbl9jb21wYXJhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoZXF1YWxpdHlfY29tcGFyYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKG11bHRpcGxpYWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGFkZGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShzdWJ0cmFjdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIoc3VidHJhY3RhYmxlMl9sZWZ0KQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoZGl2aWRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUyKGRpdmlkYWJsZTJfbGVmdCkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKG1vZGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIobW9kYWJsZTJfbGVmdCkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHhvcmFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShhbmRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUob3JhYmxlKQorCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTEoaW5jcmVtZW50YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMShkZWNyZW1lbnRhYmxlKQorCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIoZGVyZWZlcmVuY2VhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUzKGluZGV4YWJsZSkKKworQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUobGVmdF9zaGlmdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShyaWdodF9zaGlmdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShlcXVpdmFsZW50KQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUocGFydGlhbGx5X29yZGVyZWQpCisKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKHRvdGFsbHlfb3JkZXJlZCkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGFkZGl0aXZlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUobXVsdGlwbGljYXRpdmUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShpbnRlZ2VyX211bHRpcGxpY2F0aXZlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoYXJpdGhtZXRpYykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGludGVnZXJfYXJpdGhtZXRpYykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGJpdHdpc2UpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTEodW5pdF9zdGVwcGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShzaGlmdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShyaW5nX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKG9yZGVyZWRfcmluZ19vcGVyYXRvcnMpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShmaWVsZF9vcGVyYXRvcnMpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURShvcmRlcmVkX2ZpZWxkX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKGV1Y2xpZGlhbl9yaW5nX29wZXJhdG9ycykKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFKG9yZGVyZWRfZXVjbGlkaWFuX3Jpbmdfb3BlcmF0b3JzKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUoZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUob3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIoaW5wdXRfaXRlcmF0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMShvdXRwdXRfaXRlcmF0YWJsZSkKK0JPT1NUX09QRVJBVE9SX1RFTVBMQVRFMihmb3J3YXJkX2l0ZXJhdGFibGUpCitCT09TVF9PUEVSQVRPUl9URU1QTEFURTIoYmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlKQorQk9PU1RfT1BFUkFUT1JfVEVNUExBVEU0KHJhbmRvbV9hY2Nlc3NfaXRlcmF0YWJsZSkKKworI3VuZGVmIEJPT1NUX09QRVJBVE9SX1RFTVBMQVRFCisjdW5kZWYgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEU0CisjdW5kZWYgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUzCisjdW5kZWYgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUyCisjdW5kZWYgQk9PU1RfT1BFUkFUT1JfVEVNUExBVEUxCisjdW5kZWYgQk9PU1RfSU1QT1JUX1RFTVBMQVRFMQorI3VuZGVmIEJPT1NUX0lNUE9SVF9URU1QTEFURTIKKyN1bmRlZiBCT09TVF9JTVBPUlRfVEVNUExBVEUzCisjdW5kZWYgQk9PU1RfSU1QT1JUX1RFTVBMQVRFNAorCisvLyBUaGUgZm9sbG93aW5nICdvcGVyYXRvcnMnIGNsYXNzZXMgY2FuIG9ubHkgYmUgdXNlZCBwb3J0YWJseSBpZiB0aGUgZGVyaXZlZCBjbGFzcworLy8gZGVjbGFyZXMgQUxMIG9mIHRoZSByZXF1aXJlZCBtZW1iZXIgb3BlcmF0b3JzLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitzdHJ1Y3Qgb3BlcmF0b3JzMgorICAgIDogdG90YWxseV9vcmRlcmVkMjxULFUKKyAgICAsIGludGVnZXJfYXJpdGhtZXRpYzI8VCxVCisgICAgLCBiaXR3aXNlMjxULFUKKyAgICAgID4gPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVSA9IFQ+CitzdHJ1Y3Qgb3BlcmF0b3JzIDogb3BlcmF0b3JzMjxULCBVPiB7fTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBvcGVyYXRvcnM8VCwgVD4KKyAgICA6IHRvdGFsbHlfb3JkZXJlZDxUCisgICAgLCBpbnRlZ2VyX2FyaXRobWV0aWM8VAorICAgICwgYml0d2lzZTxUCisgICAgLCB1bml0X3N0ZXBwYWJsZTxUCisgICAgICA+ID4gPiA+IHt9OworCisvLyAgSXRlcmF0b3IgaGVscGVyIGNsYXNzZXMgKGNvbnRyaWJ1dGVkIGJ5IEplcmVteSBTaWVrKSAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vICAoSW5wdXQgYW5kIG91dHB1dCBpdGVyYXRvciBoZWxwZXJzIGNvbnRyaWJ1dGVkIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0vLworLy8gIChDaGFuZ2VkIHRvIHVzZSBjb21iaW5lZCBvcGVyYXRvciBjbGFzc2VzIGJ5IERhcnlsZSBXYWxrZXIpIC0tLS0tLS0tLS0tLS8vCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyBWLAorICAgICAgICAgIGNsYXNzIEQgPSBzdGQ6OnB0cmRpZmZfdCwKKyAgICAgICAgICBjbGFzcyBQID0gViBjb25zdCAqLAorICAgICAgICAgIGNsYXNzIFIgPSBWIGNvbnN0ICY+CitzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfaGVscGVyCisgIDogaW5wdXRfaXRlcmF0YWJsZTxULCBQCisgICwgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgViwgRCwgUCwgUgorICAgID4gPiB7fTsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0cnVjdCBvdXRwdXRfaXRlcmF0b3JfaGVscGVyCisgIDogb3V0cHV0X2l0ZXJhdGFibGU8VAorICAsIHN0ZDo6aXRlcmF0b3I8c3RkOjpvdXRwdXRfaXRlcmF0b3JfdGFnLCB2b2lkLCB2b2lkLCB2b2lkLCB2b2lkCisgID4gPgoreworICBUJiBvcGVyYXRvciooKSAgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCY+KCp0aGlzKTsgfQorICBUJiBvcGVyYXRvcisrKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCY+KCp0aGlzKTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgViwKKyAgICAgICAgICBjbGFzcyBEID0gc3RkOjpwdHJkaWZmX3QsCisgICAgICAgICAgY2xhc3MgUCA9IFYqLAorICAgICAgICAgIGNsYXNzIFIgPSBWJj4KK3N0cnVjdCBmb3J3YXJkX2l0ZXJhdG9yX2hlbHBlcgorICA6IGZvcndhcmRfaXRlcmF0YWJsZTxULCBQCisgICwgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBWLCBELCBQLCBSCisgICAgPiA+IHt9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyBWLAorICAgICAgICAgIGNsYXNzIEQgPSBzdGQ6OnB0cmRpZmZfdCwKKyAgICAgICAgICBjbGFzcyBQID0gViosCisgICAgICAgICAgY2xhc3MgUiA9IFYmPgorc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfaGVscGVyCisgIDogYmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlPFQsIFAKKyAgLCBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIFYsIEQsIFAsIFIKKyAgICA+ID4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBULAorICAgICAgICAgIGNsYXNzIFYsIAorICAgICAgICAgIGNsYXNzIEQgPSBzdGQ6OnB0cmRpZmZfdCwKKyAgICAgICAgICBjbGFzcyBQID0gViosCisgICAgICAgICAgY2xhc3MgUiA9IFYmPgorc3RydWN0IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfaGVscGVyCisgIDogcmFuZG9tX2FjY2Vzc19pdGVyYXRhYmxlPFQsIFAsIEQsIFIKKyAgLCBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIFYsIEQsIFAsIFIKKyAgICA+ID4KK3sKKyAgZnJpZW5kIEQgcmVxdWlyZXNfZGlmZmVyZW5jZV9vcGVyYXRvcihjb25zdCBUJiB4LCBjb25zdCBUJiB5KSB7CisgICAgcmV0dXJuIHggLSB5OworICB9Cit9OyAvLyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX2hlbHBlcgorCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoX19HTlVDX18pCisjcHJhZ21hIHJlc2V0IHdvZmYgMTIzNAorI2VuZGlmCisKKyNlbmRpZiAvLyBCT09TVF9PUEVSQVRPUlNfVjFfSFBQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM5ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5LmhwcApAQCAtMCwwICsxLDI0IEBACisvLyAgQm9vc3QgdXRpbGl0eS5ocHAgaGVhZGVyIGZpbGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLyAgQ29weXJpZ2h0IDE5OTktMjAwMyBBbGVrc2V5IEd1cnRvdm95LiAgVXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gYXJlCisvLyAgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuICAoU2VlIGFjY29tcGFueWluZyBmaWxlCisvLyAgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdCA8aHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Pi4pCisKKy8vICBTZWUgPGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS8+IGZvciB0aGUgbGlicmFyeSdzIGhvbWUgcGFnZS4KKworI2lmbmRlZiBCT09TVF9VVElMSVRZX0hQUAorI2RlZmluZSBCT09TVF9VVElMSVRZX0hQUAorCisvLyBVc2Ugb2YgdGhpcyBoZWFkZXIgaXMgZGlzY291cmFnZWQgYW5kIGl0IHdpbGwgYmUgZGVwcmVjYXRlZC4KKy8vIFBsZWFzZSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBoZWFkZXJzIGJlbG93IGluc3RlYWQuCisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvYmluYXJ5LmhwcD4KKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L2lkZW50aXR5X3R5cGUuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY29yZS9hZGRyZXNzb2YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvcmUvZW5hYmxlX2lmLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jb3JlL2NoZWNrZWRfZGVsZXRlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9jb3JlL25vbmNvcHlhYmxlLmhwcD4KKworI2VuZGlmICAvLyBCT09TVF9VVElMSVRZX0hQUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDU0MWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvYmFzZV9mcm9tX21lbWJlci5ocHAKQEAgLTAsMCArMSwxNzIgQEAKKy8vICBib29zdCB1dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwIGhlYWRlciBmaWxlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vICBDb3B5cmlnaHQgMjAwMSwgMjAwMywgMjAwNCwgMjAxMiBEYXJ5bGUgV2Fsa2VyLiAgVXNlLCBtb2RpZmljYXRpb24sIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuICAoU2VlCisvLyAgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGEgY29weSBhdAorLy8gIDxodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ+LikKKworLy8gIFNlZSA8aHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5Lz4gZm9yIHRoZSBsaWJyYXJ5J3MgaG9tZSBwYWdlLgorCisjaWZuZGVmIEJPT1NUX1VUSUxJVFlfQkFTRV9GUk9NX01FTUJFUl9IUFAKKyNkZWZpbmUgQk9PU1RfVVRJTElUWV9CQVNFX0ZST01fTUVNQkVSX0hQUAorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvYXJpdGhtZXRpYy9pbmMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW1fYmluYXJ5X3BhcmFtcy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV9wYXJhbXMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL3JlcGVhdF9mcm9tX3RvLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfY3YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL3JlbW92ZV9yZWZlcmVuY2UuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZW5hYmxlX2lmLmhwcD4KKworCisvLyAgQmFzZS1mcm9tLW1lbWJlciBhcml0eSBjb25maWd1cmF0aW9uIG1hY3JvICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIGRldGVybWluZXMgaG93IG1hbnkgYXJndW1lbnRzIHdpbGwgYmUgaW4gdGhlIGxhcmdlc3QKKy8vIGNvbnN0cnVjdG9yIHRlbXBsYXRlIG9mIGJhc2VfZnJvbV9tZW1iZXIuICBDb25zdHJ1Y3RvciB0ZW1wbGF0ZXMgd2lsbCBiZQorLy8gZ2VuZXJhdGVkIGZyb20gb25lIGFyZ3VtZW50IHRvIHRoaXMgbWF4aW11bS4gIENvZGUgZnJvbSBvdGhlciBmaWxlcyBjYW4gcmVhZAorLy8gdGhpcyBudW1iZXIgaWYgdGhleSBuZWVkIHRvIGFsd2F5cyBtYXRjaCB0aGUgZXhhY3QgbWF4aW11bSBiYXNlX2Zyb21fbWVtYmVyCisvLyB1c2VzLiAgVGhlIG1heGltdW0gY29uc3RydWN0b3IgbGVuZ3RoIGNhbiBiZSBjaGFuZ2VkIGJ5IG92ZXJyaWRpbmcgdGhlCisvLyAjZGVmaW5lZCBjb25zdGFudC4gIE1ha2Ugc3VyZSB0byBhcHBseSB0aGUgb3ZlcnJpZGUsIGlmIGFueSwgZm9yIGFsbCBzb3VyY2UKKy8vIGZpbGVzIGR1cmluZyBwcm9qZWN0IGNvbXBpbGluZyBmb3IgY29uc2lzdGVuY3kuCisKKy8vIENvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFR1cmthbmlzCisKKyNpZm5kZWYgQk9PU1RfQkFTRV9GUk9NX01FTUJFUl9NQVhfQVJJVFkKKyNkZWZpbmUgQk9PU1RfQkFTRV9GUk9NX01FTUJFUl9NQVhfQVJJVFkgIDEwCisjZW5kaWYKKworCisvLyAgQW4gaXRlcmF0aW9uIG9mIGEgY29uc3RydWN0b3IgdGVtcGxhdGUgZm9yIGJhc2VfZnJvbV9tZW1iZXIgIC0tLS0tLS0tLS0tLS0vLworCisvLyBBIG1hY3JvIHRoYXQgc2hvdWxkIGV4cGFuZCB0bzoKKy8vICAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCAuLi4sIHR5cGVuYW1lIFRuID4KKy8vICAgICBiYXNlX2Zyb21fbWVtYmVyKCBUMSB4MSwgLi4uLCBUbiB4biApCisvLyAgICAgICAgIDogbWVtYmVyKCB4MSwgLi4uLCB4biApCisvLyAgICAgICAgIHt9CisvLyBUaGlzIG1hY3JvIHNob3VsZCBvbmx5IHBlcnNpc3Qgd2l0aGluIHRoaXMgZmlsZS4KKworI2RlZmluZSBCT09TVF9QUklWQVRFX0NUUl9ERUYoIHosIG4sIGRhdGEgKSAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGUgPCBCT09TVF9QUF9FTlVNX1BBUkFNUyhuLCB0eXBlbmFtZSBUKSA+ICAgICAgICAgIFwKKyAgICBiYXNlX2Zyb21fbWVtYmVyKCBCT09TVF9QUF9FTlVNX0JJTkFSWV9QQVJBTVMobiwgVCwgeCkgKSAgXAorICAgICAgICA6IG1lbWJlciggQk9PU1RfUFBfRU5VTV9QQVJBTVMobiwgeCkgKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiovCisKKworbmFtZXNwYWNlIGJvb3N0Cit7CisKK25hbWVzcGFjZSBkZXRhaWwKK3sKKworLy8gIFR5cGUtdW5tYXJraW5nIGNsYXNzIHRlbXBsYXRlICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gVHlwZS10cmFpdCB0byBnZXQgdGhlIHJhdyB0eXBlLCBpLmUuIHRoZSB0eXBlIHdpdGhvdXQgdG9wLWxldmVsIHJlZmVyZW5jZSBub3IKKy8vIGN2LXF1YWxpZmljYXRpb24sIGZyb20gYSB0eXBlIGV4cHJlc3Npb24uICBNYWlubHkgZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cywgYW55CisvLyByZWZlcmVuY2UgcGFydCBpcyBzdHJpcHBlZCBmaXJzdC4KKworLy8gQ29udHJpYnV0ZWQgYnkgRGFyeWxlIFdhbGtlcgorCit0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorc3RydWN0IHJlbW92ZV9jdl9yZWYKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIDo6Ym9vc3Q6OnJlbW92ZV9jdjx0eXBlbmFtZQorICAgICA6OmJvb3N0OjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlPjo6dHlwZSAgdHlwZTsKKworfTsgIC8vIGJvb3N0OjpkZXRhaWw6OnJlbW92ZV9jdl9yZWYKKworLy8gIFVubWFya2VkLXR5cGUgY29tcGFyaXNvbiBjbGFzcyB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gVHlwZS10cmFpdCB0byBjaGVjayBpZiB0d28gdHlwZSBleHByZXNzaW9ucyBoYXZlIHRoZSBzYW1lIHJhdyB0eXBlLgorCisvLyBDb250cmlidXRlZCBieSBEYXJ5bGUgV2Fsa2VyLCBiYXNlZCBvbiBhIHdvcmstYXJvdW5kIGJ5IEx1YyBEYW50b24KKwordGVtcGxhdGUgPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVID4KK3N0cnVjdCBpc19yZWxhdGVkCisgICAgOiBwdWJsaWMgOjpib29zdDo6aXNfc2FtZTwKKyAgICAgdHlwZW5hbWUgOjpib29zdDo6ZGV0YWlsOjpyZW1vdmVfY3ZfcmVmPFQ+Ojp0eXBlLAorICAgICB0eXBlbmFtZSA6OmJvb3N0OjpkZXRhaWw6OnJlbW92ZV9jdl9yZWY8VT46OnR5cGUgPgore307CisKKy8vICBFbmFibGUtaWYtb24tdW5pZGVudGljYWwtdW5tYXJrZWQtdHlwZSBjbGFzcyB0ZW1wbGF0ZSAgLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKy8vIEVuYWJsZS1pZiBvbiB0aGUgZmlyc3QgdHdvIHR5cGUgZXhwcmVzc2lvbnMgTk9UIGhhdmluZyB0aGUgc2FtZSByYXcgdHlwZS4KKworLy8gQ29udHJpYnV0ZWQgYnkgRGFyeWxlIFdhbGtlciwgYmFzZWQgb24gYSB3b3JrLWFyb3VuZCBieSBMdWMgRGFudG9uCisKKyNpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfVkFSSUFESUNfVEVNUExBVEVTCit0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UPgorc3RydWN0IGVuYWJsZV9pZl91bnJlbGF0ZWQKKyAgICA6IHB1YmxpYyA6OmJvb3N0OjplbmFibGVfaWZfYzx0cnVlPgore307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIC4uLlUyPgorc3RydWN0IGVuYWJsZV9pZl91bnJlbGF0ZWQ8VCwgVSwgVTIuLi4+CisgICAgOiBwdWJsaWMgOjpib29zdDo6ZGlzYWJsZV9pZjwgOjpib29zdDo6ZGV0YWlsOjppc19yZWxhdGVkPFQsIFU+ID4KK3t9OworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBib29zdDo6ZGV0YWlsCisKKworLy8gIEJhc2UtZnJvbS1tZW1iZXIgY2xhc3MgdGVtcGxhdGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gSGVscGVyIHRvIGluaXRpYWxpemUgYSBiYXNlIG9iamVjdCBzbyBhIGRlcml2ZWQgY2xhc3MgY2FuIHVzZSB0aGlzCisvLyBvYmplY3QgaW4gdGhlIGluaXRpYWxpemF0aW9uIG9mIGFub3RoZXIgYmFzZSBjbGFzcy4gIFVzZWQgYnkKKy8vIERpZXRtYXIgS3VlaGwgZnJvbSBpZGVhcyBieSBSb24gS2xhdGNobyB0byBzb2x2ZSB0aGUgcHJvYmxlbSBvZiBhCisvLyBiYXNlIGNsYXNzIG5lZWRpbmcgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgYSBtZW1iZXIuCisKKy8vIENvbnRyaWJ1dGVkIGJ5IERhcnlsZSBXYWxrZXIKKwordGVtcGxhdGUgPCB0eXBlbmFtZSBNZW1iZXJUeXBlLCBpbnQgVW5pcXVlSUQgPSAwID4KK2NsYXNzIGJhc2VfZnJvbV9tZW1iZXIKK3sKK3Byb3RlY3RlZDoKKyAgICBNZW1iZXJUeXBlICBtZW1iZXI7CisKKyNpZiAhZGVmaW5lZChCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUykgJiYgXAorICAgICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX1ZBUklBRElDX1RFTVBMQVRFUykgJiYgXAorICAgICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX0ZVTkNUSU9OX1RFTVBMQVRFX0RFRkFVTFRfQVJHUykgJiYgXAorICAgICEoZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA8IDQpKQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5ULCB0eXBlbmFtZSBFbmFibGVJZiA9IHR5cGVuYW1lCisgICAgIDo6Ym9vc3Q6OmRldGFpbDo6ZW5hYmxlX2lmX3VucmVsYXRlZDxiYXNlX2Zyb21fbWVtYmVyLCBULi4uPjo6dHlwZT4KKyAgICBleHBsaWNpdCBCT09TVF9DT05TVEVYUFIgYmFzZV9mcm9tX21lbWJlciggVCYmIC4uLnggKQorICAgICAgICBCT09TVF9OT0VYQ0VQVF9JRiggQk9PU1RfTk9FWENFUFRfRVhQUig6Om5ldyAoKHZvaWQqKSAwKSBNZW1iZXJUeXBlKAorICAgICAgICAgc3RhdGljX2Nhc3Q8VCYmPih4KS4uLiApKSApICAvLyBubyBzdGQ6OmlzX25vdGhyb3dfY29uc3RydWN0aWJsZS4uLgorICAgICAgICA6IG1lbWJlciggc3RhdGljX2Nhc3Q8VCYmPih4KS4uLiApICAgICAvLyAuLi5ub3Igc3RkOjpmb3J3YXJkIG5lZWRlZAorICAgICAgICB7fQorI2Vsc2UKKyAgICBiYXNlX2Zyb21fbWVtYmVyKCkKKyAgICAgICAgOiBtZW1iZXIoKQorICAgICAgICB7fQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMCA+IGV4cGxpY2l0IGJhc2VfZnJvbV9tZW1iZXIoIFQwIHgwICkgOiBtZW1iZXIoIHgwICkge30KKyAgICBCT09TVF9QUF9SRVBFQVRfRlJPTV9UTyggMiwgQk9PU1RfUFBfSU5DKEJPT1NUX0JBU0VfRlJPTV9NRU1CRVJfTUFYX0FSSVRZKSwKKyAgICAgQk9PU1RfUFJJVkFURV9DVFJfREVGLCBfICkKKyNlbmRpZgorCit9OyAgLy8gYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXIKKwordGVtcGxhdGUgPCB0eXBlbmFtZSBNZW1iZXJUeXBlLCBpbnQgVW5pcXVlSUQgPgorY2xhc3MgYmFzZV9mcm9tX21lbWJlcjxNZW1iZXJUeXBlJiwgVW5pcXVlSUQ+Cit7Citwcm90ZWN0ZWQ6CisgICAgTWVtYmVyVHlwZSYgbWVtYmVyOworCisgICAgZXhwbGljaXQgQk9PU1RfQ09OU1RFWFBSIGJhc2VfZnJvbV9tZW1iZXIoIE1lbWJlclR5cGUmIHggKQorICAgICAgICBCT09TVF9OT0VYQ0VQVAorICAgICAgICA6IG1lbWJlciggeCApCisgICAgICAgIHt9CisKK307ICAvLyBib29zdDo6YmFzZV9mcm9tX21lbWJlcgorCit9ICAvLyBuYW1lc3BhY2UgYm9vc3QKKworCisvLyBVbmRvIGFueSBwcml2YXRlIG1hY3JvcworI3VuZGVmIEJPT1NUX1BSSVZBVEVfQ1RSX0RFRgorCisKKyNlbmRpZiAgLy8gQk9PU1RfVVRJTElUWV9CQVNFX0ZST01fTUVNQkVSX0hQUApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2JpbmFyeS5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvYmluYXJ5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2JpbmFyeS5ocHAKQEAgLTAsMCArMSw3MDggQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDUgTWF0dGhldyBDYWxhYnJlc2UKKworICAgIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyAgICBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgQk9PU1RfVVRJTElUWV9CSU5BUllfSFBQCisjZGVmaW5lIEJPT1NUX1VUSUxJVFlfQklOQVJZX0hQUAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBCaW5hcnkgTGl0ZXJhbCBVdGlsaXR5CisgICAgX19fX19fX19fX19fX19fX19fX19fXworCisKKyAgICBUaGUgZm9sbG93aW5nIGNvZGUgd29ya3MgYnkgY29udmVydGluZyB0aGUgaW5wdXQgYml0IHBhdHRlcm4gaW50byBhCisgICAgQm9vc3QuUHJlcHJvY2Vzc29yIHNlcXVlbmNlLCB0aGVuIGNvbnZlcnRpbmcgZ3JvdXBpbmdzIG9mIDMgYml0cyBlYWNoIGludG8KKyAgICB0aGUgY29ycmVzcG9uZGluZyBvY3RhbCBkaWdpdCwgYW5kIGZpbmFsbHkgY29uY2F0ZW5hdGluZyBhbGwgb2YgdGhlIGRpZ2l0cworICAgIHRvZ2V0aGVyIGFsb25nIHdpdGggYSBsZWFkaW5nIHplcm8uIFRoaXMgeWllbGRzIGEgc3RhbmRhcmQgb2N0YWwgbGl0ZXJhbAorICAgIHdpdGggdGhlIGRlc2lyZWQgdmFsdWUgYXMgc3BlY2lmaWVkIGluIGJpdHMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvY29udHJvbC9kZWR1Y2VfZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2ZhY2lsaXRpZXMvaWRlbnRpdHkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9jYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9zZXEvY2F0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3Ivc2VxL3RyYW5zZm9ybS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2FyaXRobWV0aWMvbW9kLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3Ivc2VxL3NpemUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9mYWNpbGl0aWVzL2VtcHR5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvY29udHJvbC93aGlsZS5ocHA+CisKKyNkZWZpbmUgQk9PU1RfQklOQVJZKCBiaXRfZ3JvdXBpbmdzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0JJTkFSWV9MSVRFUkFMX0QoIEJPT1NUX1BQX0RFRFVDRV9EKCksIGJpdF9ncm91cGluZ3MgKSAKKworI2RlZmluZSBCT09TVF9CSU5BUllfVSggYml0X2dyb3VwaW5ncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfU1VGRklYRURfQklOQVJZX0xJVEVSQUwoIGJpdF9ncm91cGluZ3MsIFUgKSAKKworI2RlZmluZSBCT09TVF9CSU5BUllfTCggYml0X2dyb3VwaW5ncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfU1VGRklYRURfQklOQVJZX0xJVEVSQUwoIGJpdF9ncm91cGluZ3MsIEwgKSAKKworI2RlZmluZSBCT09TVF9CSU5BUllfVUwoIGJpdF9ncm91cGluZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfU1VGRklYRURfQklOQVJZX0xJVEVSQUwoIGJpdF9ncm91cGluZ3MsIFVMICkgCisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX0xVKCBiaXRfZ3JvdXBpbmdzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX1NVRkZJWEVEX0JJTkFSWV9MSVRFUkFMKCBiaXRfZ3JvdXBpbmdzLCBMVSApIAorCisjZGVmaW5lIEJPT1NUX0JJTkFSWV9MTCggYml0X2dyb3VwaW5ncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9TVUZGSVhFRF9CSU5BUllfTElURVJBTCggYml0X2dyb3VwaW5ncywgTEwgKSAKKworI2RlZmluZSBCT09TVF9CSU5BUllfVUxMKCBiaXRfZ3JvdXBpbmdzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfU1VGRklYRURfQklOQVJZX0xJVEVSQUwoIGJpdF9ncm91cGluZ3MsIFVMTCApIAorCisjZGVmaW5lIEJPT1NUX0JJTkFSWV9MTFUoIGJpdF9ncm91cGluZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9TVUZGSVhFRF9CSU5BUllfTElURVJBTCggYml0X2dyb3VwaW5ncywgTExVICkgCisKKyNkZWZpbmUgQk9PU1RfU1VGRklYRURfQklOQVJZX0xJVEVSQUwoIGJpdF9ncm91cGluZ3MsIHN1ZmZpeCApICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX1NVRkZJWEVEX0JJTkFSWV9MSVRFUkFMX0QoIEJPT1NUX1BQX0RFRFVDRV9EKCksIGJpdF9ncm91cGluZ3MsIHN1ZmZpeCApIAorCisjZGVmaW5lIEJPT1NUX1NVRkZJWEVEX0JJTkFSWV9MSVRFUkFMX0QoIGQsIGJpdF9ncm91cGluZ3MsIHN1ZmZpeCApICAgICAgICAgICAgXAorICBCT09TVF9QUF9DQVQoIEJPT1NUX0JJTkFSWV9MSVRFUkFMX0QoIGQsIGJpdF9ncm91cGluZ3MgKSwgc3VmZml4ICkgCisKKyNkZWZpbmUgQk9PU1RfQklOQVJZX0xJVEVSQUxfRCggZCwgYml0X2dyb3VwaW5ncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX1BQX1NFUV9DQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoICgwKSBCT09TVF9ERVRBSUxfQ1JFQVRFX0JJTkFSWV9MSVRFUkFMX09DVEFMX1NFUVVFTkNFKCBkLCBiaXRfZ3JvdXBpbmdzICkgIFwKKyAgKSAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQ1JFQVRFX0JJTkFSWV9MSVRFUkFMX09DVEFMX1NFUVVFTkNFKCBkLCBiaXRfZ3JvdXBpbmdzICkgIFwKKyAgQk9PU1RfUFBfU0VRX1RSQU5TRk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAsIEJPT1NUX1BQX05JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLCBCT09TVF9QUF9JREVOVElUWSggQk9PU1RfREVUQUlMX0NPTlZFUlRfQklUX1NFUVVFTkNFX1RPX1RSSVBMRV9TRVFVRU5DRSApKClcCisgICAgKCBCT09TVF9ERVRBSUxfQ09NUExFVEVfVFJJUExFX1NFUVVFTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAsIEJPT1NUX0RFVEFJTF9DUkVBVEVfQklOQVJZX0xJVEVSQUxfQklUX1NFUVVFTkNFKCBkLCBiaXRfZ3JvdXBpbmdzICkgICAgXAorICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0NPTlZFUlRfQklUX1NFUVVFTkNFX1RPX1RSSVBMRV9TRVFVRU5DRSggYml0X3NlcXVlbmNlICkgICBcCisgIEJPT1NUX1BQX0NBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8xIGJpdF9zZXF1ZW5jZSAgICAgIFwKKyAgLCBFTkRfQklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJVFNfUEVSX09DVElUIDMKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQ09NUExFVEVfVFJJUExFX1NFUVVFTkNFKCBkLCBpbmNvbXBsZXRlX25pYmJsZV9zZXF1ZW5jZSApIFwKKyAgQk9PU1RfUFBfQ0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggQk9PU1RfREVUQUlMX0NSRUFURV9UUklQTEVfQ09NUExFVElPTl9TRVFVRU5DRV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAsIEJPT1NUX1BQX01PRF9EKCBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICwgQk9PU1RfUFBfU0VRX1NJWkUoIGluY29tcGxldGVfbmliYmxlX3NlcXVlbmNlICkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAsIEJPT1NUX0RFVEFJTF9CSVRTX1BFUl9PQ1RJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGluY29tcGxldGVfbmliYmxlX3NlcXVlbmNlIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9GSVhFRF9DT01QTCggYml0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9QUF9DQVQoIEJPT1NUX0RFVEFJTF9GSVhFRF9DT01QTF8sIGJpdCApCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0ZJWEVEX0NPTVBMXzAgMSAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfRklYRURfQ09NUExfMSAwIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DUkVBVEVfQklOQVJZX0xJVEVSQUxfQklUX1NFUVVFTkNFKCBkLCBiaXRfZ3JvdXBpbmdzICkgICAgXAorICBCT09TVF9QUF9FTVBUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfUFBfQ0FUKCBCT09TVF9QUF9XSElMRV8sIGQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICggQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX1BSRURJQ0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAsIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLCBiaXRfZ3JvdXBpbmdzICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICkgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX1BSRURJQ0FURSggZCwgc3RhdGUgKSAgICAgICAgICAgICAgICAgICAgICBcCisgIEJPT1NUX0RFVEFJTF9GSVhFRF9DT01QTCggQk9PU1RfREVUQUlMX0lTX05VTExBUllfQVJHUyggc3RhdGUgKSApIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9PUEVSQVRJT04oIGQsIHN0YXRlICkgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9ERVRBSUxfU1BMSVRfQU5EX1NXQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBCT09TVF9QUF9DQVQoIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXywgc3RhdGUgKSApIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9UUklQTEVfVE9fT0NUQUxfT1BFUkFUSU9OKCBzLCBkdW1teV9wYXJhbSwgdHVwbGUgKSAgICAgICAgXAorICBCT09TVF9ERVRBSUxfVEVSTkFSWV9UUklQTEVfVE9fT0NUQUwgdHVwbGUgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RFUk5BUllfVFJJUExFX1RPX09DVEFMKCBiaXQyLCBiaXQxLCBiaXQwICkgICAgICAgICAgICAgICBcCisgIEJPT1NUX0RFVEFJTF9UUklQTEVfVE9fT0NUQUxfICMjIGJpdDIgIyMgYml0MSAjIyBiaXQwIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DUkVBVEVfVFJJUExFX0NPTVBMRVRJT05fU0VRVUVOQ0VfMSAoMCkoMCkKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0NSRUFURV9UUklQTEVfQ09NUExFVElPTl9TRVFVRU5DRV8yICgwKQorI2RlZmluZSBCT09TVF9ERVRBSUxfQ1JFQVRFX1RSSVBMRV9DT01QTEVUSU9OX1NFUVVFTkNFXzAgIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8xRU5EX0JJVCAgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0NPTlZFUlRfQklUX1NFUVVFTkNFX1RPX1BBUkVOVEhFVElDX1RVUExFXzEoIGJpdCApICAgICAgICBcCisgICggKCBiaXQsIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8yIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8yKCBiaXQgKSAgICAgICAgXAorICBiaXQsIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8zIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8zKCBiaXQgKSAgICAgICAgXAorICBiaXQgKSApIEJPT1NUX0RFVEFJTF9DT05WRVJUX0JJVF9TRVFVRU5DRV9UT19QQVJFTlRIRVRJQ19UVVBMRV8xIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9TUExJVF9BTkRfU1dBUCggcGFyYW1zICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9QUF9JREVOVElUWSggQk9PU1RfREVUQUlMX1NQTElUX0FORF9TV0FQX1BBUkFNUyApKCkoIHBhcmFtcyApCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1NQTElUX0FORF9TV0FQX1BBUkFNUyggZmlyc3RfcGFyYW0sIHNlY29uZF9wYXJhbSApICAgICAgICBcCisgIHNlY29uZF9wYXJhbSBmaXJzdF9wYXJhbSAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfTEVGVF9PRl9DT01NQSggcGFyYW1zICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfUFBfSURFTlRJVFkoIEJPT1NUX0RFVEFJTF9GSVJTVF9NQUNST19QQVJBTSApKCkoIHBhcmFtcyApIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9GSVJTVF9NQUNST19QQVJBTSggZmlyc3RfcGFyYW0sIHNlY29uZF9wYXJhbSApICAgICAgICAgICAgXAorICBmaXJzdF9wYXJhbSAKKworLyogQmVnaW4gZGVyaXZlZCBjb25jZXB0cyBmcm9tIENoYW9zIGJ5IFBhdWwgTWVuc29uaWRlcyAqLworCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9JU19OVUxMQVJZX0FSR1MoIHBhcmFtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCT09TVF9ERVRBSUxfTEVGVF9PRl9DT01NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKCBCT09TVF9QUF9DQVQoIEJPT1NUX0RFVEFJTF9JU19OVUxMQVJZX0FSR1NfUl8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgLCBCT09TVF9ERVRBSUxfSVNfTlVMTEFSWV9BUkdTX0MgcGFyYW0gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKSAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfSVNfTlVMTEFSWV9BUkdTX0MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMSAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfSVNfTlVMTEFSWV9BUkdTX1JfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgMSwgQk9PU1RfUFBfTklMIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9JU19OVUxMQVJZX0FSR1NfUl9CT09TVF9ERVRBSUxfSVNfTlVMTEFSWV9BUkdTX0MgICAgICAgICAgXAorICAwLCBCT09TVF9QUF9OSUwgCisKKy8qIEVuZCBkZXJpdmVkIGNvbmNlcHRzIGZyb20gQ2hhb3MgYnkgUGF1bCBNZW5zb25pZGVzICovCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8wMDAgMCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8wMDEgMSAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8wMTAgMiAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8wMTEgMyAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8xMDAgNCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8xMDEgNSAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8xMTAgNiAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX1RSSVBMRV9UT19PQ1RBTF8xMTEgNyAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wICgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEgKDEpLCAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMCAoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMSAoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMCAoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMSAoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMCAoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMSAoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMCAoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMSAoMSkoMSksIAorCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMCAoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEgKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwICgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMSAoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAgKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxICgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMCAoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEgKDEpKDEpKDEpLCAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwICgwKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDEgKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMCAoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExICgwKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDAgKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMSAoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwICgwKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTEgKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMCAoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxICgxKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTAgKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMSAoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwICgxKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDEgKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMCAoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExICgxKSgxKSgxKSgxKSwgCisKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMDAgKDApKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMDEgKDApKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTAgKDApKDApKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTEgKDApKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDAgKDApKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDEgKDApKDApKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMTAgKDApKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMTEgKDApKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDAgKDApKDEpKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDEgKDApKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTAgKDApKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTEgKDApKDEpKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMDAgKDApKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMDEgKDApKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTAgKDApKDEpKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTEgKDApKDEpKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDAgKDEpKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDEgKDEpKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMTAgKDEpKDApKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMTEgKDEpKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDAgKDEpKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDEgKDEpKDApKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTAgKDEpKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTEgKDEpKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMDAgKDEpKDEpKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMDEgKDEpKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTAgKDEpKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTEgKDEpKDEpKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDAgKDEpKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDEgKDEpKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMTAgKDEpKDEpKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMTEgKDEpKDEpKDEpKDEpKDEpLCAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAgKDApKDApKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMDAxICgwKSgwKSgwKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDAxMCAoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTEgKDApKDApKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTAwICgwKSgwKSgwKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDEwMSAoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAgKDApKDApKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTExICgwKSgwKSgwKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTAwMCAoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDEgKDApKDApKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDEwICgwKSgwKSgxKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTAxMSAoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAgKDApKDApKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMTAxICgwKSgwKSgxKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTExMCAoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTEgKDApKDApKDEpKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDAwICgwKSgxKSgwKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDAwMSAoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAgKDApKDEpKDApKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDExICgwKSgxKSgwKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDEwMCAoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDEgKDApKDEpKDApKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTEwICgwKSgxKSgwKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDExMSAoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAgKDApKDEpKDEpKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMDAxICgwKSgxKSgxKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTAxMCAoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTEgKDApKDEpKDEpKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTAwICgwKSgxKSgxKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTEwMSAoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAgKDApKDEpKDEpKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTExICgwKSgxKSgxKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDAwMCAoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDEgKDEpKDApKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDEwICgxKSgwKSgwKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDAxMSAoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAgKDEpKDApKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMTAxICgxKSgwKSgwKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDExMCAoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTEgKDEpKDApKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDAwICgxKSgwKSgxKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTAwMSAoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAgKDEpKDApKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDExICgxKSgwKSgxKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTEwMCAoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDEgKDEpKDApKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTEwICgxKSgwKSgxKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTExMSAoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAgKDEpKDEpKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMDAxICgxKSgxKSgwKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDAxMCAoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTEgKDEpKDEpKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTAwICgxKSgxKSgwKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDEwMSAoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAgKDEpKDEpKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTExICgxKSgxKSgwKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTAwMCAoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDEgKDEpKDEpKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDEwICgxKSgxKSgxKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTAxMSAoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAgKDEpKDEpKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMTAxICgxKSgxKSgxKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTExMCAoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTEgKDEpKDEpKDEpKDEpKDEpKDEpLCAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAwICgwKSgwKSgwKSgwKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDAwMDEgKDApKDApKDApKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMDAxMCAoMCkoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDExICgwKSgwKSgwKSgwKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDAxMDAgKDApKDApKDApKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMDEwMSAoMCkoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTEwICgwKSgwKSgwKSgwKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDAxMTEgKDApKDApKDApKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTAwMCAoMCkoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDAxICgwKSgwKSgwKSgxKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDEwMTAgKDApKDApKDApKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTAxMSAoMCkoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAwICgwKSgwKSgwKSgxKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMDExMDEgKDApKDApKDApKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAwMTExMCAoMCkoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTExICgwKSgwKSgwKSgxKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTAwMDAgKDApKDApKDEpKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDAwMSAoMCkoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDEwICgwKSgwKSgxKSgwKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTAwMTEgKDApKDApKDEpKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDEwMCAoMCkoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTAxICgwKSgwKSgxKSgwKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTAxMTAgKDApKDApKDEpKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMDExMSAoMCkoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAwICgwKSgwKSgxKSgxKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTEwMDEgKDApKDApKDEpKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMTAxMCAoMCkoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDExICgwKSgwKSgxKSgxKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTExMDAgKDApKDApKDEpKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDAxMTEwMSAoMCkoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTEwICgwKSgwKSgxKSgxKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAwMTExMTEgKDApKDApKDEpKDEpKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDAwMCAoMCkoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDAxICgwKSgxKSgwKSgwKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDAwMTAgKDApKDEpKDApKDApKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDAxMSAoMCkoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAwICgwKSgxKSgwKSgwKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDAxMDEgKDApKDEpKDApKDApKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMDExMCAoMCkoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTExICgwKSgxKSgwKSgwKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDEwMDAgKDApKDEpKDApKDEpKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTAwMSAoMCkoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDEwICgwKSgxKSgwKSgxKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDEwMTEgKDApKDEpKDApKDEpKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTEwMCAoMCkoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTAxICgwKSgxKSgwKSgxKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMDExMTAgKDApKDEpKDApKDEpKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDEwMTExMSAoMCkoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAwICgwKSgxKSgxKSgwKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTAwMDEgKDApKDEpKDEpKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMDAxMCAoMCkoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDExICgwKSgxKSgxKSgwKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTAxMDAgKDApKDEpKDEpKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMDEwMSAoMCkoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTEwICgwKSgxKSgxKSgwKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTAxMTEgKDApKDEpKDEpKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTAwMCAoMCkoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDAxICgwKSgxKSgxKSgxKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTEwMTAgKDApKDEpKDEpKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTAxMSAoMCkoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAwICgwKSgxKSgxKSgxKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzAxMTExMDEgKDApKDEpKDEpKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMDExMTExMCAoMCkoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTExICgwKSgxKSgxKSgxKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDAwMDAgKDEpKDApKDApKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDAwMSAoMSkoMCkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDEwICgxKSgwKSgwKSgwKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDAwMTEgKDEpKDApKDApKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDEwMCAoMSkoMCkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTAxICgxKSgwKSgwKSgwKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDAxMTAgKDEpKDApKDApKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMDExMSAoMSkoMCkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAwICgxKSgwKSgwKSgxKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDEwMDEgKDEpKDApKDApKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMTAxMCAoMSkoMCkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDExICgxKSgwKSgwKSgxKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDExMDAgKDEpKDApKDApKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAwMTEwMSAoMSkoMCkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTEwICgxKSgwKSgwKSgxKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMDExMTEgKDEpKDApKDApKDEpKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDAwMCAoMSkoMCkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDAxICgxKSgwKSgxKSgwKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTAwMTAgKDEpKDApKDEpKDApKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDAxMSAoMSkoMCkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAwICgxKSgwKSgxKSgwKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTAxMDEgKDEpKDApKDEpKDApKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMDExMCAoMSkoMCkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTExICgxKSgwKSgxKSgwKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTEwMDAgKDEpKDApKDEpKDEpKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTAwMSAoMSkoMCkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDEwICgxKSgwKSgxKSgxKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTEwMTEgKDEpKDApKDEpKDEpKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTEwMCAoMSkoMCkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTAxICgxKSgwKSgxKSgxKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzEwMTExMTAgKDEpKDApKDEpKDEpKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTAxMTExMSAoMSkoMCkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAwICgxKSgxKSgwKSgwKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDAwMDEgKDEpKDEpKDApKDApKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMDAxMCAoMSkoMSkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDExICgxKSgxKSgwKSgwKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDAxMDAgKDEpKDEpKDApKDApKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMDEwMSAoMSkoMSkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTEwICgxKSgxKSgwKSgwKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDAxMTEgKDEpKDEpKDApKDApKDEpKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTAwMCAoMSkoMSkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDAxICgxKSgxKSgwKSgxKSgwKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDEwMTAgKDEpKDEpKDApKDEpKDApKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTAxMSAoMSkoMSkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAwICgxKSgxKSgwKSgxKSgxKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMDExMDEgKDEpKDEpKDApKDEpKDEpKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTEwMTExMCAoMSkoMSkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTExICgxKSgxKSgwKSgxKSgxKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTAwMDAgKDEpKDEpKDEpKDApKDApKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDAwMSAoMSkoMSkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDEwICgxKSgxKSgxKSgwKSgwKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTAwMTEgKDEpKDEpKDEpKDApKDApKDEpKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDEwMCAoMSkoMSkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTAxICgxKSgxKSgxKSgwKSgxKSgwKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTAxMTAgKDEpKDEpKDEpKDApKDEpKDEpKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMDExMSAoMSkoMSkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAwICgxKSgxKSgxKSgxKSgwKSgwKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTEwMDEgKDEpKDEpKDEpKDEpKDApKDApKDEpLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMTAxMCAoMSkoMSkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDExICgxKSgxKSgxKSgxKSgwKSgxKSgxKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTExMDAgKDEpKDEpKDEpKDEpKDEpKDApKDApLCAKKyNkZWZpbmUgQk9PU1RfREVUQUlMX0JJTkFSWV9MSVRFUkFMX0VMRU1FTlRfMTExMTEwMSAoMSkoMSkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTEwICgxKSgxKSgxKSgxKSgxKSgxKSgwKSwgCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9CSU5BUllfTElURVJBTF9FTEVNRU5UXzExMTExMTEgKDEpKDEpKDEpKDEpKDEpKDEpKDEpLCAKKworI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAwMCAoMCkoMCkoMCkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAwMSAoMCkoMCkoMCkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAxMCAoMCkoMCkoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDAxMSAoMCkoMCkoMCkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDEwMCAoMCkoMCkoMCkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDEwMSAoMCkoMCkoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDExMCAoMCkoMCkoMCkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMDExMSAoMCkoMCkoMCkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTAwMCAoMCkoMCkoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTAwMSAoMCkoMCkoMCkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTAxMCAoMCkoMCkoMCkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTAxMSAoMCkoMCkoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTEwMCAoMCkoMCkoMCkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTEwMSAoMCkoMCkoMCkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTExMCAoMCkoMCkoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAwMTExMSAoMCkoMCkoMCkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDAwMCAoMCkoMCkoMCkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDAwMSAoMCkoMCkoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDAxMCAoMCkoMCkoMCkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDAxMSAoMCkoMCkoMCkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDEwMCAoMCkoMCkoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDEwMSAoMCkoMCkoMCkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDExMCAoMCkoMCkoMCkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMDExMSAoMCkoMCkoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAwMCAoMCkoMCkoMCkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAwMSAoMCkoMCkoMCkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAxMCAoMCkoMCkoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTAxMSAoMCkoMCkoMCkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTEwMCAoMCkoMCkoMCkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTEwMSAoMCkoMCkoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTExMCAoMCkoMCkoMCkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDAxMTExMSAoMCkoMCkoMCkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDAwMCAoMCkoMCkoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDAwMSAoMCkoMCkoMSkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDAxMCAoMCkoMCkoMSkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDAxMSAoMCkoMCkoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDEwMCAoMCkoMCkoMSkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDEwMSAoMCkoMCkoMSkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDExMCAoMCkoMCkoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMDExMSAoMCkoMCkoMSkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTAwMCAoMCkoMCkoMSkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTAwMSAoMCkoMCkoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTAxMCAoMCkoMCkoMSkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTAxMSAoMCkoMCkoMSkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTEwMCAoMCkoMCkoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTEwMSAoMCkoMCkoMSkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTExMCAoMCkoMCkoMSkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDEwMTExMSAoMCkoMCkoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAwMCAoMCkoMCkoMSkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAwMSAoMCkoMCkoMSkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAxMCAoMCkoMCkoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDAxMSAoMCkoMCkoMSkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDEwMCAoMCkoMCkoMSkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDEwMSAoMCkoMCkoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDExMCAoMCkoMCkoMSkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMDExMSAoMCkoMCkoMSkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTAwMCAoMCkoMCkoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTAwMSAoMCkoMCkoMSkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTAxMCAoMCkoMCkoMSkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTAxMSAoMCkoMCkoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTEwMCAoMCkoMCkoMSkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTEwMSAoMCkoMCkoMSkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTExMCAoMCkoMCkoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMDExMTExMSAoMCkoMCkoMSkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDAwMCAoMCkoMSkoMCkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDAwMSAoMCkoMSkoMCkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDAxMCAoMCkoMSkoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDAxMSAoMCkoMSkoMCkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDEwMCAoMCkoMSkoMCkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDEwMSAoMCkoMSkoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDExMCAoMCkoMSkoMCkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMDExMSAoMCkoMSkoMCkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAwMCAoMCkoMSkoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAwMSAoMCkoMSkoMCkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAxMCAoMCkoMSkoMCkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTAxMSAoMCkoMSkoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTEwMCAoMCkoMSkoMCkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTEwMSAoMCkoMSkoMCkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTExMCAoMCkoMSkoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAwMTExMSAoMCkoMSkoMCkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDAwMCAoMCkoMSkoMCkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDAwMSAoMCkoMSkoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDAxMCAoMCkoMSkoMCkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDAxMSAoMCkoMSkoMCkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDEwMCAoMCkoMSkoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDEwMSAoMCkoMSkoMCkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDExMCAoMCkoMSkoMCkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMDExMSAoMCkoMSkoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTAwMCAoMCkoMSkoMCkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTAwMSAoMCkoMSkoMCkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTAxMCAoMCkoMSkoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTAxMSAoMCkoMSkoMCkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTEwMCAoMCkoMSkoMCkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTEwMSAoMCkoMSkoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTExMCAoMCkoMSkoMCkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTAxMTExMSAoMCkoMSkoMCkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAwMCAoMCkoMSkoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAwMSAoMCkoMSkoMSkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAxMCAoMCkoMSkoMSkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDAxMSAoMCkoMSkoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDEwMCAoMCkoMSkoMSkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDEwMSAoMCkoMSkoMSkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDExMCAoMCkoMSkoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMDExMSAoMCkoMSkoMSkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTAwMCAoMCkoMSkoMSkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTAwMSAoMCkoMSkoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTAxMCAoMCkoMSkoMSkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTAxMSAoMCkoMSkoMSkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTEwMCAoMCkoMSkoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTEwMSAoMCkoMSkoMSkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTExMCAoMCkoMSkoMSkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTEwMTExMSAoMCkoMSkoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDAwMCAoMCkoMSkoMSkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDAwMSAoMCkoMSkoMSkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDAxMCAoMCkoMSkoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDAxMSAoMCkoMSkoMSkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDEwMCAoMCkoMSkoMSkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDEwMSAoMCkoMSkoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDExMCAoMCkoMSkoMSkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMDExMSAoMCkoMSkoMSkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAwMCAoMCkoMSkoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAwMSAoMCkoMSkoMSkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAxMCAoMCkoMSkoMSkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTAxMSAoMCkoMSkoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTEwMCAoMCkoMSkoMSkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTEwMSAoMCkoMSkoMSkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTExMCAoMCkoMSkoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8wMTExMTExMSAoMCkoMSkoMSkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDAwMCAoMSkoMCkoMCkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDAwMSAoMSkoMCkoMCkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDAxMCAoMSkoMCkoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDAxMSAoMSkoMCkoMCkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDEwMCAoMSkoMCkoMCkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDEwMSAoMSkoMCkoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDExMCAoMSkoMCkoMCkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMDExMSAoMSkoMCkoMCkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTAwMCAoMSkoMCkoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTAwMSAoMSkoMCkoMCkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTAxMCAoMSkoMCkoMCkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTAxMSAoMSkoMCkoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTEwMCAoMSkoMCkoMCkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTEwMSAoMSkoMCkoMCkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTExMCAoMSkoMCkoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAwMTExMSAoMSkoMCkoMCkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAwMCAoMSkoMCkoMCkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAwMSAoMSkoMCkoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAxMCAoMSkoMCkoMCkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDAxMSAoMSkoMCkoMCkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDEwMCAoMSkoMCkoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDEwMSAoMSkoMCkoMCkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDExMCAoMSkoMCkoMCkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMDExMSAoMSkoMCkoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTAwMCAoMSkoMCkoMCkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTAwMSAoMSkoMCkoMCkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTAxMCAoMSkoMCkoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTAxMSAoMSkoMCkoMCkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTEwMCAoMSkoMCkoMCkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTEwMSAoMSkoMCkoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTExMCAoMSkoMCkoMCkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDAxMTExMSAoMSkoMCkoMCkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDAwMCAoMSkoMCkoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDAwMSAoMSkoMCkoMSkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDAxMCAoMSkoMCkoMSkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDAxMSAoMSkoMCkoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDEwMCAoMSkoMCkoMSkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDEwMSAoMSkoMCkoMSkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDExMCAoMSkoMCkoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMDExMSAoMSkoMCkoMSkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAwMCAoMSkoMCkoMSkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAwMSAoMSkoMCkoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAxMCAoMSkoMCkoMSkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTAxMSAoMSkoMCkoMSkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTEwMCAoMSkoMCkoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTEwMSAoMSkoMCkoMSkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTExMCAoMSkoMCkoMSkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDEwMTExMSAoMSkoMCkoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDAwMCAoMSkoMCkoMSkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDAwMSAoMSkoMCkoMSkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDAxMCAoMSkoMCkoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDAxMSAoMSkoMCkoMSkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDEwMCAoMSkoMCkoMSkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDEwMSAoMSkoMCkoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDExMCAoMSkoMCkoMSkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMDExMSAoMSkoMCkoMSkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTAwMCAoMSkoMCkoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTAwMSAoMSkoMCkoMSkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTAxMCAoMSkoMCkoMSkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTAxMSAoMSkoMCkoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTEwMCAoMSkoMCkoMSkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTEwMSAoMSkoMCkoMSkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTExMCAoMSkoMCkoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMDExMTExMSAoMSkoMCkoMSkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAwMCAoMSkoMSkoMCkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAwMSAoMSkoMSkoMCkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAxMCAoMSkoMSkoMCkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDAxMSAoMSkoMSkoMCkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDEwMCAoMSkoMSkoMCkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDEwMSAoMSkoMSkoMCkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDExMCAoMSkoMSkoMCkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMDExMSAoMSkoMSkoMCkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTAwMCAoMSkoMSkoMCkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTAwMSAoMSkoMSkoMCkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTAxMCAoMSkoMSkoMCkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTAxMSAoMSkoMSkoMCkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTEwMCAoMSkoMSkoMCkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTEwMSAoMSkoMSkoMCkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTExMCAoMSkoMSkoMCkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAwMTExMSAoMSkoMSkoMCkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDAwMCAoMSkoMSkoMCkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDAwMSAoMSkoMSkoMCkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDAxMCAoMSkoMSkoMCkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDAxMSAoMSkoMSkoMCkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDEwMCAoMSkoMSkoMCkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDEwMSAoMSkoMSkoMCkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDExMCAoMSkoMSkoMCkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMDExMSAoMSkoMSkoMCkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAwMCAoMSkoMSkoMCkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAwMSAoMSkoMSkoMCkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAxMCAoMSkoMSkoMCkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTAxMSAoMSkoMSkoMCkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTEwMCAoMSkoMSkoMCkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTEwMSAoMSkoMSkoMCkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTExMCAoMSkoMSkoMCkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTAxMTExMSAoMSkoMSkoMCkoMSkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDAwMCAoMSkoMSkoMSkoMCkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDAwMSAoMSkoMSkoMSkoMCkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDAxMCAoMSkoMSkoMSkoMCkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDAxMSAoMSkoMSkoMSkoMCkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDEwMCAoMSkoMSkoMSkoMCkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDEwMSAoMSkoMSkoMSkoMCkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDExMCAoMSkoMSkoMSkoMCkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMDExMSAoMSkoMSkoMSkoMCkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTAwMCAoMSkoMSkoMSkoMCkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTAwMSAoMSkoMSkoMSkoMCkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTAxMCAoMSkoMSkoMSkoMCkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTAxMSAoMSkoMSkoMSkoMCkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTEwMCAoMSkoMSkoMSkoMCkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTEwMSAoMSkoMSkoMSkoMCkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTExMCAoMSkoMSkoMSkoMCkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTEwMTExMSAoMSkoMSkoMSkoMCkoMSkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAwMCAoMSkoMSkoMSkoMSkoMCkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAwMSAoMSkoMSkoMSkoMSkoMCkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAxMCAoMSkoMSkoMSkoMSkoMCkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDAxMSAoMSkoMSkoMSkoMSkoMCkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDEwMCAoMSkoMSkoMSkoMSkoMCkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDEwMSAoMSkoMSkoMSkoMSkoMCkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDExMCAoMSkoMSkoMSkoMSkoMCkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMDExMSAoMSkoMSkoMSkoMSkoMCkoMSkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTAwMCAoMSkoMSkoMSkoMSkoMSkoMCkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTAwMSAoMSkoMSkoMSkoMSkoMSkoMCkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTAxMCAoMSkoMSkoMSkoMSkoMSkoMCkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTAxMSAoMSkoMSkoMSkoMSkoMSkoMCkoMSkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTEwMCAoMSkoMSkoMSkoMSkoMSkoMSkoMCkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTEwMSAoMSkoMSkoMSkoMSkoMSkoMSkoMCkoMSksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTExMCAoMSkoMSkoMSkoMSkoMSkoMSkoMSkoMCksIAorI2RlZmluZSBCT09TVF9ERVRBSUxfQklOQVJZX0xJVEVSQUxfRUxFTUVOVF8xMTExMTExMSAoMSkoMSkoMSkoMSkoMSkoMSkoMSkoMSksIAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9jb21wYXJlX3BvaW50ZWVzLmhwcCBiL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9jb21wYXJlX3BvaW50ZWVzLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWIyMWNkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2NvbXBhcmVfcG9pbnRlZXMuaHBwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwMywgRmVybmFuZG8gTHVpcyBDYWNjaW9sYSBDYXJiYWxsYWwuCisvLworLy8gVXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLworLy8gU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvb3B0aW9uYWwgZm9yIGRvY3VtZW50YXRpb24uCisvLworLy8gWW91IGFyZSB3ZWxjb21lIHRvIGNvbnRhY3QgdGhlIGF1dGhvciBhdDoKKy8vICBmZXJuYW5kb19jYWNjaW9sYUBob3RtYWlsLmNvbQorLy8KKyNpZm5kZWYgQk9PU1RfVVRJTElUWV9DT01QQVJFX1BPSU5URUVTXzI1QUdPMjAwM19IUFAKKyNkZWZpbmUgQk9PU1RfVVRJTElUWV9DT01QQVJFX1BPSU5URUVTXzI1QUdPMjAwM19IUFAKKworI2luY2x1ZGU8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGJvb3N0IHsKKworLy8gdGVtcGxhdGU8Y2xhc3MgT1A+IGJvb2wgZXF1YWxfcG9pbnRlZXMoT1AgY29uc3QmIHgsIE9QIGNvbnN0JiB5KTsKKy8vIHRlbXBsYXRlPGNsYXNzIE9QPiBzdHJ1Y3QgZXF1YWxfcG9pbnRlZXNfdDsKKy8vCisvLyBCZWluZyBPUCBhIG1vZGVsIG9mIE9wdGlvbmFsUG9pbnRlZSAoZWl0aGVyIGEgcG9pbnRlciBvciBhbiBvcHRpb25hbCk6CisvLworLy8gSWYgYm90aCB4IGFuZCB5IGhhdmUgdmFsaWQgcG9pbnRlZXMsIHJldHVybnMgdGhlIHJlc3VsdCBvZiAoKnggPT0gKnkpCisvLyBJZiBvbmx5IG9uZSBoYXMgYSB2YWxpZCBwb2ludGVlLCByZXR1cm5zIGZhbHNlLgorLy8gSWYgbm9uZSBoYXZlIHZhbGlkIHBvaW50ZWVzLCByZXR1cm5zIHRydWUuCisvLyBOby10aHJvdwordGVtcGxhdGU8Y2xhc3MgT3B0aW9uYWxQb2ludGVlPgoraW5saW5lCitib29sIGVxdWFsX3BvaW50ZWVzICggT3B0aW9uYWxQb2ludGVlIGNvbnN0JiB4LCBPcHRpb25hbFBvaW50ZWUgY29uc3QmIHkgKQoreworICByZXR1cm4gKCF4KSAhPSAoIXkpID8gZmFsc2UgOiAoICF4ID8gdHJ1ZSA6ICgqeCkgPT0gKCp5KSApIDsKK30KKwordGVtcGxhdGU8Y2xhc3MgT3B0aW9uYWxQb2ludGVlPgorc3RydWN0IGVxdWFsX3BvaW50ZWVzX3QKK3sKKyAgdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOworICB0eXBlZGVmIE9wdGlvbmFsUG9pbnRlZSBmaXJzdF9hcmd1bWVudF90eXBlOworICB0eXBlZGVmIE9wdGlvbmFsUG9pbnRlZSBzZWNvbmRfYXJndW1lbnRfdHlwZTsKKworICBib29sIG9wZXJhdG9yKCkgKCBPcHRpb25hbFBvaW50ZWUgY29uc3QmIHgsIE9wdGlvbmFsUG9pbnRlZSBjb25zdCYgeSApIGNvbnN0CisgICAgeyByZXR1cm4gZXF1YWxfcG9pbnRlZXMoeCx5KSA7IH0KK30gOworCisvLyB0ZW1wbGF0ZTxjbGFzcyBPUD4gYm9vbCBsZXNzX3BvaW50ZWVzKE9QIGNvbnN0JiB4LCBPUCBjb25zdCYgeSk7CisvLyB0ZW1wbGF0ZTxjbGFzcyBPUD4gc3RydWN0IGxlc3NfcG9pbnRlZXNfdDsKKy8vCisvLyBCZWluZyBPUCBhIG1vZGVsIG9mIE9wdGlvbmFsUG9pbnRlZSAoZWl0aGVyIGEgcG9pbnRlciBvciBhbiBvcHRpb25hbCk6CisvLworLy8gSWYgeSBoYXMgbm90IGEgdmFsaWQgcG9pbnRlZSwgcmV0dXJucyBmYWxzZS4KKy8vIEVsc2VJZiB4IGhhcyBub3QgYSB2YWxpZCBwb2ludGVlLCByZXR1cm5zIHRydWUuCisvLyBFbHNlSWYgYm90aCB4IGFuZCB5IGhhdmUgdmFsaWQgcG9pbnRlZXMsIHJldHVybnMgdGhlIHJlc3VsdCBvZiAoKnggPCAqeSkKKy8vIE5vLXRocm93Cit0ZW1wbGF0ZTxjbGFzcyBPcHRpb25hbFBvaW50ZWU+CitpbmxpbmUKK2Jvb2wgbGVzc19wb2ludGVlcyAoIE9wdGlvbmFsUG9pbnRlZSBjb25zdCYgeCwgT3B0aW9uYWxQb2ludGVlIGNvbnN0JiB5ICkKK3sKKyAgcmV0dXJuICF5ID8gZmFsc2UgOiAoICF4ID8gdHJ1ZSA6ICgqeCkgPCAoKnkpICkgOworfQorCit0ZW1wbGF0ZTxjbGFzcyBPcHRpb25hbFBvaW50ZWU+CitzdHJ1Y3QgbGVzc19wb2ludGVlc190Cit7CisgIHR5cGVkZWYgYm9vbCByZXN1bHRfdHlwZTsKKyAgdHlwZWRlZiBPcHRpb25hbFBvaW50ZWUgZmlyc3RfYXJndW1lbnRfdHlwZTsKKyAgdHlwZWRlZiBPcHRpb25hbFBvaW50ZWUgc2Vjb25kX2FyZ3VtZW50X3R5cGU7CisKKyAgYm9vbCBvcGVyYXRvcigpICggT3B0aW9uYWxQb2ludGVlIGNvbnN0JiB4LCBPcHRpb25hbFBvaW50ZWUgY29uc3QmIHkgKSBjb25zdAorICAgIHsgcmV0dXJuIGxlc3NfcG9pbnRlZXMoeCx5KSA7IH0KK30gOworCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9pbl9wbGFjZV9mYWN0b3J5X3ByZWZpeC5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvZGV0YWlsL2luX3BsYWNlX2ZhY3RvcnlfcHJlZml4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmQ3NmI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9pbl9wbGFjZV9mYWN0b3J5X3ByZWZpeC5ocHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDAzLCBGZXJuYW5kbyBMdWlzIENhY2Npb2xhIENhcmJhbGxhbC4KKy8vIENvcHlyaWdodCAoQykgMjAwNywgVG9iaWFzIFNjaHdpbmdlci4KKy8vCisvLyBVc2UsIG1vZGlmaWNhdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBTZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9vcHRpb25hbCBmb3IgZG9jdW1lbnRhdGlvbi4KKy8vCisvLyBZb3UgYXJlIHdlbGNvbWUgdG8gY29udGFjdCB0aGUgYXV0aG9yIGF0OgorLy8gIGZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tCisvLworI2lmbmRlZiBCT09TVF9VVElMSVRZX0RFVEFJTF9JTlBMQUNFX0ZBQ1RPUllfUFJFRklYXzA0QVBSMjAwN19IUFAKKyNkZWZpbmUgQk9PU1RfVVRJTElUWV9ERVRBSUxfSU5QTEFDRV9GQUNUT1JZX1BSRUZJWF8wNEFQUjIwMDdfSFBQCisKKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9jYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9wdW5jdHVhdGlvbi9wYXJlbi5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2l0ZXJhdGlvbi9pdGVyYXRlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9yZXBlYXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW1fcGFyYW1zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9lbnVtX2JpbmFyeV9wYXJhbXMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW1fdHJhaWxpbmdfcGFyYW1zLmhwcD4KKworI2RlZmluZSBCT09TVF9ERUZJTkVfSU5QTEFDRV9GQUNUT1JZX0NMQVNTX01FTUJFUl9JTklUKHosbixfKSBCT09TVF9QUF9DQVQobV9hLG4pIEJPT1NUX1BQX0xQQVJFTigpIEJPT1NUX1BQX0NBVChhLG4pIEJPT1NUX1BQX1JQQVJFTigpCisjZGVmaW5lIEJPT1NUX0RFRklORV9JTlBMQUNFX0ZBQ1RPUllfQ0xBU1NfTUVNQkVSX0RFQ0woeixuLF8pIEJPT1NUX1BQX0NBVChBLG4pIGNvbnN0JiBCT09TVF9QUF9DQVQobV9hLG4pOworCisjZGVmaW5lIEJPT1NUX01BWF9JTlBMQUNFX0ZBQ1RPUllfQVJJVFkgMTAKKworI3VuZGVmIEJPT1NUX1VUSUxJVFlfREVUQUlMX0lOUExBQ0VfRkFDVE9SWV9TVUZGSVhfMDRBUFIyMDA3X0hQUAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9pbl9wbGFjZV9mYWN0b3J5X3N1ZmZpeC5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvZGV0YWlsL2luX3BsYWNlX2ZhY3Rvcnlfc3VmZml4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY0OGM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9pbl9wbGFjZV9mYWN0b3J5X3N1ZmZpeC5ocHAKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDAzLCBGZXJuYW5kbyBMdWlzIENhY2Npb2xhIENhcmJhbGxhbC4KKy8vIENvcHlyaWdodCAoQykgMjAwNywgVG9iaWFzIFNjaHdpbmdlci4KKy8vCisvLyBVc2UsIG1vZGlmaWNhdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBTZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9vcHRpb25hbCBmb3IgZG9jdW1lbnRhdGlvbi4KKy8vCisvLyBZb3UgYXJlIHdlbGNvbWUgdG8gY29udGFjdCB0aGUgYXV0aG9yIGF0OgorLy8gIGZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tCisvLworI2lmbmRlZiBCT09TVF9VVElMSVRZX0RFVEFJTF9JTlBMQUNFX0ZBQ1RPUllfU1VGRklYXzA0QVBSMjAwN19IUFAKKyNkZWZpbmUgQk9PU1RfVVRJTElUWV9ERVRBSUxfSU5QTEFDRV9GQUNUT1JZX1NVRkZJWF8wNEFQUjIwMDdfSFBQCisKKyN1bmRlZiBCT09TVF9ERUZJTkVfSU5QTEFDRV9GQUNUT1JZX0NMQVNTX01FTUJFUl9JTklUCisjdW5kZWYgQk9PU1RfREVGSU5FX0lOUExBQ0VfRkFDVE9SWV9DTEFTU19NRU1CRVJfREVDTAorI3VuZGVmIEJPT1NUX01BWF9JTlBMQUNFX0ZBQ1RPUllfQVJJVFkKKworI3VuZGVmIEJPT1NUX1VUSUxJVFlfREVUQUlMX0lOUExBQ0VfRkFDVE9SWV9QUkVGSVhfMDRBUFIyMDA3X0hQUAorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9taW5zdGRfcmFuZC5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvZGV0YWlsL21pbnN0ZF9yYW5kLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWVmYjIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9taW5zdGRfcmFuZC5ocHAKQEAgLTAsMCArMSw1OCBAQAorI2lmbmRlZiBCT09TVF9VVElMSVRZX0RFVEFJTF9NSU5TVERfUkFORF9IUFBfSU5DTFVERUQKKyNkZWZpbmUgQk9PU1RfVVRJTElUWV9ERVRBSUxfTUlOU1REX1JBTkRfSFBQX0lOQ0xVREVECisKKy8vIENvcHlyaWdodCAyMDE3IFBldGVyIERpbW92CisvLworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0CisvLworLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgbWluc3RkX3JhbmQgdGhhdCBkb2VzIG5vdCByZXF1aXJlCisvLyB0aGUgUmFuZG9tIGxpYnJhcnkKKworI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgorCituYW1lc3BhY2UgYm9vc3QKK3sKK25hbWVzcGFjZSBkZXRhaWwKK3sKKworY2xhc3MgbWluc3RkX3JhbmQKK3sKK3ByaXZhdGU6CisKKyAgICBib29zdDo6dWludF9sZWFzdDMyX3QgeF87CisKKyAgICBlbnVtIHsgYSA9IDQ4MjcxLCBtID0gMjE0NzQ4MzY0NyB9OworCitwdWJsaWM6CisKKyAgICBtaW5zdGRfcmFuZCgpOiB4XyggMSApCisgICAgeworICAgIH0KKworICAgIGV4cGxpY2l0IG1pbnN0ZF9yYW5kKCBib29zdDo6dWludF9sZWFzdDMyX3QgeCApOiB4XyggeCAlIG0gKQorICAgIHsKKyAgICAgICAgaWYoIHhfID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICB4XyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29zdDo6dWludF9sZWFzdDMyX3Qgb3BlcmF0b3IoKSgpCisgICAgeworICAgICAgICBib29zdDo6dWludF9sZWFzdDY0X3QgeSA9IHhfOworCisgICAgICAgIHkgPSAoIGEgKiB5ICkgJSBtOworCisgICAgICAgIHhfID0gc3RhdGljX2Nhc3Q8Ym9vc3Q6OnVpbnRfbGVhc3QzMl90PiggeSApOworCisgICAgICAgIHJldHVybiB4XzsKKyAgICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIGJvb3N0CisKKyNlbmRpZiAvLyAjaWZuZGVmIEJPT1NUX1VUSUxJVFlfREVUQUlMX01JTlNURF9SQU5EX0hQUF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9yZXN1bHRfb2ZfaXRlcmF0ZS5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvZGV0YWlsL3Jlc3VsdF9vZl9pdGVyYXRlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUzODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2RldGFpbC9yZXN1bHRfb2ZfaXRlcmF0ZS5ocHAKQEAgLTAsMCArMSwyMTggQEAKKy8vIEJvb3N0IHJlc3VsdF9vZiBsaWJyYXJ5CisKKy8vICBDb3B5cmlnaHQgRG91Z2xhcyBHcmVnb3IgMjAwNC4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vICBDb3B5cmlnaHQgRGFuaWVsIFdhbGtlciwgRXJpYyBOaWVibGVyLCBNaWNoZWwgTW9yaW4gMjAwOC0yMDEyLgorLy8gIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKy8vICBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKKy8vICBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkKKyNpZiAhZGVmaW5lZChCT09TVF9QUF9JU19JVEVSQVRJTkcpCisjIGVycm9yIEJvb3N0IHJlc3VsdF9vZiAtIGRvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSEKKyNlbmRpZgorCisvLyBDV1BybzggcmVxdWlyZXMgYW4gYXJndW1lbnQgaW4gYSBmdW5jdGlvbiB0eXBlIHNwZWNpYWxpemF0aW9uCisjaWYgQk9PU1RfV09SS0FST1VORChfX01XRVJLU19fLCBCT09TVF9URVNURURfQVQoMHgzMDAyKSkgJiYgQk9PU1RfUFBfSVRFUkFUSU9OKCkgPT0gMAorIyBkZWZpbmUgQk9PU1RfUkVTVUxUX09GX0FSR1Mgdm9pZAorI2Vsc2UKKyMgZGVmaW5lIEJPT1NUX1JFU1VMVF9PRl9BUkdTIEJPT1NUX1BQX0VOVU1fUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLFQpCisjZW5kaWYKKworI2lmICFCT09TVF9XT1JLQVJPVU5EKF9fQk9STEFORENfXywgQk9PU1RfVEVTVEVEX0FUKDB4NTUxKSkKK3RlbXBsYXRlPHR5cGVuYW1lIEYgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksdHlwZW5hbWUgVCk+CitzdHJ1Y3QgdHIxX3Jlc3VsdF9vZjxGKEJPT1NUX1JFU1VMVF9PRl9BUkdTKT4KKyAgICA6IGNvbmRpdGlvbmFsPAorICAgICAgICBpc19wb2ludGVyPEY+Ojp2YWx1ZSB8fCBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxGPjo6dmFsdWUKKyAgICAgICAgLCBib29zdDo6ZGV0YWlsOjp0cjFfcmVzdWx0X29mX2ltcGw8CisgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8Rj46OnR5cGUsCisgICAgICAgICAgICB0eXBlbmFtZSByZW1vdmVfY3Y8Rj46OnR5cGUoQk9PU1RfUkVTVUxUX09GX0FSR1MpLAorICAgICAgICAgICAgKGJvb3N0OjpkZXRhaWw6OnJlc3VsdF9vZl9oYXNfcmVzdWx0X3R5cGU8Rj46OnZhbHVlKT4KKyAgICAgICAgLCBib29zdDo6ZGV0YWlsOjp0cjFfcmVzdWx0X29mX2ltcGw8CisgICAgICAgICAgICBGLAorICAgICAgICAgICAgRihCT09TVF9SRVNVTFRfT0ZfQVJHUyksCisgICAgICAgICAgICAoYm9vc3Q6OmRldGFpbDo6cmVzdWx0X29mX2hhc19yZXN1bHRfdHlwZTxGPjo6dmFsdWUpPiA+Ojp0eXBlIHsgfTsKKyNlbmRpZgorCisjaWZkZWYgQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRQordGVtcGxhdGU8dHlwZW5hbWUgRiBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCByZXN1bHRfb2Y8RihCT09TVF9SRVNVTFRfT0ZfQVJHUyk+CisgICAgOiBkZXRhaWw6OmNwcDB4X3Jlc3VsdF9vZjxGKEJPT1NUX1JFU1VMVF9PRl9BUkdTKT4geyB9OworI2VuZGlmIC8vIEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUKKworI2lmZGVmIEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0sKK3RlbXBsYXRlPHR5cGVuYW1lIEYgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksdHlwZW5hbWUgVCk+CitzdHJ1Y3QgcmVzdWx0X29mPEYoQk9PU1RfUkVTVUxUX09GX0FSR1MpPgorICAgIDogY29uZGl0aW9uYWw8ZGV0YWlsOjpyZXN1bHRfb2ZfaGFzX3Jlc3VsdF90eXBlPEY+Ojp2YWx1ZSB8fCBkZXRhaWw6OnJlc3VsdF9vZl9oYXNfcmVzdWx0PEY+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIHRyMV9yZXN1bHRfb2Y8RihCT09TVF9SRVNVTFRfT0ZfQVJHUyk+LAorICAgICAgICAgICAgICAgZGV0YWlsOjpjcHAweF9yZXN1bHRfb2Y8RihCT09TVF9SRVNVTFRfT0ZfQVJHUyk+ID46OnR5cGUgeyB9OworI2VuZGlmIC8vIEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0sKKworI2lmIGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRSkgfHwgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLKQorCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgRiBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCBjcHAweF9yZXN1bHRfb2Y8RihCT09TVF9QUF9FTlVNX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSxUKSk+CisgICAgOiBjb25kaXRpb25hbDwKKyAgICAgICAgICBpc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxGPjo6dmFsdWUKKyAgICAgICAgLCBkZXRhaWw6OnRyMV9yZXN1bHRfb2ZfaW1wbDwKKyAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxGPjo6dHlwZSwKKyAgICAgICAgICAgIHR5cGVuYW1lIHJlbW92ZV9jdjxGPjo6dHlwZShCT09TVF9QUF9FTlVNX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSxUKSksIGZhbHNlCisgICAgICAgICAgPgorICAgICAgICAsIGRldGFpbDo6Y3BwMHhfcmVzdWx0X29mX2ltcGw8CisgICAgICAgICAgICAgIEYoQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksVCkpCisgICAgICAgICAgPgorICAgICAgPjo6dHlwZQore307CisKKyNpZmRlZiBCT09TVF9OT19TRklOQUVfRVhQUgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGPgorc3RydWN0IEJPT1NUX1BQX0NBVChyZXN1bHRfb2ZfY2FsbGFibGVfZnVuXzJfLCBCT09TVF9QUF9JVEVSQVRJT04oKSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksIHR5cGVuYW1lIFQpPgorc3RydWN0IEJPT1NUX1BQX0NBVChyZXN1bHRfb2ZfY2FsbGFibGVfZnVuXzJfLCBCT09TVF9QUF9JVEVSQVRJT04oKSk8UihCT09TVF9QUF9FTlVNX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSwgVCkpPiB7CisgICAgUiBvcGVyYXRvcigpKEJPT1NUX1BQX0VOVU1fUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLCBUKSkgY29uc3Q7CisgICAgdHlwZWRlZiByZXN1bHRfb2ZfcHJpdmF0ZV90eXBlIGNvbnN0ICYoKnBmbl90KSguLi4pOworICAgIG9wZXJhdG9yIHBmbl90KCkgY29uc3Qgdm9sYXRpbGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGPgorc3RydWN0IEJPT1NUX1BQX0NBVChyZXN1bHRfb2ZfY2FsbGFibGVfZnVuXywgQk9PU1RfUFBfSVRFUkFUSU9OKCkpCisgIDogQk9PU1RfUFBfQ0FUKHJlc3VsdF9vZl9jYWxsYWJsZV9mdW5fMl8sIEJPT1NUX1BQX0lURVJBVElPTigpKTxGPgore307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEY+CitzdHJ1Y3QgQk9PU1RfUFBfQ0FUKHJlc3VsdF9vZl9jYWxsYWJsZV9mdW5fLCBCT09TVF9QUF9JVEVSQVRJT04oKSk8RiAqPgorICA6IEJPT1NUX1BQX0NBVChyZXN1bHRfb2ZfY2FsbGFibGVfZnVuXzJfLCBCT09TVF9QUF9JVEVSQVRJT04oKSk8Rj4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGPgorc3RydWN0IEJPT1NUX1BQX0NBVChyZXN1bHRfb2Zfc2VsZWN0X2NhbGxfd3JhcHBlcl90eXBlXywgQk9PU1RfUFBfSVRFUkFUSU9OKCkpCisgIDogY29uZGl0aW9uYWw8CisgICAgICAgIGlzX2NsYXNzPHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8Rj46OnR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgcmVzdWx0X29mX3dyYXBfY2FsbGFibGVfY2xhc3M8Rj4sCisgICAgICAgIHR5cGVfaWRlbnRpdHk8Qk9PU1RfUFBfQ0FUKHJlc3VsdF9vZl9jYWxsYWJsZV9mdW5fLCBCT09TVF9QUF9JVEVSQVRJT04oKSk8dHlwZW5hbWUgcmVtb3ZlX2N2PHR5cGVuYW1lIHJlbW92ZV9yZWZlcmVuY2U8Rj46OnR5cGU+Ojp0eXBlPiA+CisgICAgPjo6dHlwZQore307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEYgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksIHR5cGVuYW1lIFQpPgorc3RydWN0IEJPT1NUX1BQX0NBVChyZXN1bHRfb2ZfaXNfY2FsbGFibGVfLCBCT09TVF9QUF9JVEVSQVRJT04oKSkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgQk9PU1RfUFBfQ0FUKHJlc3VsdF9vZl9zZWxlY3RfY2FsbF93cmFwcGVyX3R5cGVfLCBCT09TVF9QUF9JVEVSQVRJT04oKSk8Rj46OnR5cGUgd3JhcHBlcl90OworICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gKAorICAgICAgICBzaXplb2YocmVzdWx0X29mX25vX3R5cGUpID09IHNpemVvZihkZXRhaWw6OnJlc3VsdF9vZl9pc19wcml2YXRlX3R5cGUoCisgICAgICAgICAgICAoYm9vc3Q6OmRlY2x2YWw8d3JhcHBlcl90PigpKEJPT1NUX1BQX0VOVU1fQklOQVJZX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSwgYm9vc3Q6OmRlY2x2YWw8VCwgPigpIEJPT1NUX1BQX0lOVEVSQ0VQVCkpLCByZXN1bHRfb2Zfd2VpcmRfdHlwZSgpKQorICAgICAgICApKQorICAgICk7CisgICAgdHlwZWRlZiBpbnRlZ3JhbF9jb25zdGFudDxib29sLCB2YWx1ZT4gdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEYgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksdHlwZW5hbWUgVCk+CitzdHJ1Y3QgY3BwMHhfcmVzdWx0X29mX2ltcGw8RihCT09TVF9QUF9FTlVNX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSxUKSksIHRydWU+CisgICAgOiBsYXp5X2VuYWJsZV9pZjwKKyAgICAgICAgICBCT09TVF9QUF9DQVQocmVzdWx0X29mX2lzX2NhbGxhYmxlXywgQk9PU1RfUFBfSVRFUkFUSU9OKCkpPEYgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksIFQpPgorICAgICAgICAsIGNwcDB4X3Jlc3VsdF9vZl9pbXBsPEYoQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksVCkpLCBmYWxzZT4KKyAgICAgID4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGIEJPT1NUX1BQX0VOVU1fVFJBSUxJTkdfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLHR5cGVuYW1lIFQpPgorc3RydWN0IGNwcDB4X3Jlc3VsdF9vZl9pbXBsPEYoQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksVCkpLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiBkZWNsdHlwZSgKKyAgICBib29zdDo6ZGVjbHZhbDxGPigpKAorICAgICAgQk9PU1RfUFBfRU5VTV9CSU5BUllfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLCBib29zdDo6ZGVjbHZhbDxULCA+KCkgQk9PU1RfUFBfSU5URVJDRVBUKQorICAgICkKKyAgKSB0eXBlOworfTsKKworI2Vsc2UgLy8gQk9PU1RfTk9fU0ZJTkFFX0VYUFIKKwordGVtcGxhdGU8dHlwZW5hbWUgRiBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCBjcHAweF9yZXN1bHRfb2ZfaW1wbDxGKEJPT1NUX1BQX0VOVU1fUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLFQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSByZXN1bHRfb2ZfYWx3YXlzX3ZvaWQ8ZGVjbHR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpkZWNsdmFsPEY+KCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9FTlVNX0JJTkFSWV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksIGJvb3N0OjpkZWNsdmFsPFQsID4oKSBCT09TVF9QUF9JTlRFUkNFUFQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApPjo6dHlwZT4geworICB0eXBlZGVmIGRlY2x0eXBlKAorICAgIGJvb3N0OjpkZWNsdmFsPEY+KCkoCisgICAgICBCT09TVF9QUF9FTlVNX0JJTkFSWV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksIGJvb3N0OjpkZWNsdmFsPFQsID4oKSBCT09TVF9QUF9JTlRFUkNFUFQpCisgICAgKQorICApIHR5cGU7Cit9OworCisjZW5kaWYgLy8gQk9PU1RfTk9fU0ZJTkFFX0VYUFIKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKyNlbHNlIC8vIGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRSkgfHwgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLKQorCisjaWYgIUJPT1NUX1dPUktBUk9VTkQoX19CT1JMQU5EQ19fLCBCT09TVF9URVNURURfQVQoMHg1NTEpKQordGVtcGxhdGU8dHlwZW5hbWUgRiBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCByZXN1bHRfb2Y8RihCT09TVF9SRVNVTFRfT0ZfQVJHUyk+CisgICAgOiB0cjFfcmVzdWx0X29mPEYoQk9PU1RfUkVTVUxUX09GX0FSR1MpPiB7IH07CisjZW5kaWYKKworI2VuZGlmIC8vIGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRSkKKworI3VuZGVmIEJPT1NUX1JFU1VMVF9PRl9BUkdTCisKKyNpZiBCT09TVF9QUF9JVEVSQVRJT04oKSA+PSAxCisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCAgdHlwZW5hbWUgRkFyZ3MgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksdHlwZW5hbWUgVCk+CitzdHJ1Y3QgdHIxX3Jlc3VsdF9vZl9pbXBsPFIgKCopKEJPT1NUX1BQX0VOVU1fUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLFQpKSwgRkFyZ3MsIGZhbHNlPgoreworICB0eXBlZGVmIFIgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsICB0eXBlbmFtZSBGQXJncyBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCB0cjFfcmVzdWx0X29mX2ltcGw8UiAoJikoQk9PU1RfUFBfRU5VTV9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksVCkpLCBGQXJncywgZmFsc2U+Cit7CisgIHR5cGVkZWYgUiB0eXBlOworfTsKKworI2lmICFCT09TVF9XT1JLQVJPVU5EKF9fQk9STEFORENfXywgQk9PU1RfVEVTVEVEX0FUKDB4NTUxKSkKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEZBcmdzIEJPT1NUX1BQX0VOVU1fVFJBSUxJTkdfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLHR5cGVuYW1lIFQpPgorc3RydWN0IHRyMV9yZXN1bHRfb2ZfaW1wbDxSIChUMDo6KikKKyAgICAgICAgICAgICAgICAgICAgIChCT09TVF9QUF9FTlVNX1NISUZURURfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLFQpKSwKKyAgICAgICAgICAgICAgICAgRkFyZ3MsIGZhbHNlPgoreworICB0eXBlZGVmIFIgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEZBcmdzIEJPT1NUX1BQX0VOVU1fVFJBSUxJTkdfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLHR5cGVuYW1lIFQpPgorc3RydWN0IHRyMV9yZXN1bHRfb2ZfaW1wbDxSIChUMDo6KikKKyAgICAgICAgICAgICAgICAgICAgIChCT09TVF9QUF9FTlVNX1NISUZURURfUEFSQU1TKEJPT1NUX1BQX0lURVJBVElPTigpLFQpKQorICAgICAgICAgICAgICAgICAgICAgY29uc3QsCisgICAgICAgICAgICAgICAgIEZBcmdzLCBmYWxzZT4KK3sKKyAgdHlwZWRlZiBSIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBGQXJncyBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSx0eXBlbmFtZSBUKT4KK3N0cnVjdCB0cjFfcmVzdWx0X29mX2ltcGw8UiAoVDA6OiopCisgICAgICAgICAgICAgICAgICAgICAoQk9PU1RfUFBfRU5VTV9TSElGVEVEX1BBUkFNUyhCT09TVF9QUF9JVEVSQVRJT04oKSxUKSkKKyAgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlLAorICAgICAgICAgICAgICAgICBGQXJncywgZmFsc2U+Cit7CisgIHR5cGVkZWYgUiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRkFyZ3MgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksdHlwZW5hbWUgVCk+CitzdHJ1Y3QgdHIxX3Jlc3VsdF9vZl9pbXBsPFIgKFQwOjoqKQorICAgICAgICAgICAgICAgICAgICAgKEJPT1NUX1BQX0VOVU1fU0hJRlRFRF9QQVJBTVMoQk9PU1RfUFBfSVRFUkFUSU9OKCksVCkpCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgRkFyZ3MsIGZhbHNlPgoreworICB0eXBlZGVmIFIgdHlwZTsKK307CisjZW5kaWYKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvaWRlbnRpdHlfdHlwZS5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGExZjZjNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9pZGVudGl0eV90eXBlLmhwcApAQCAtMCwwICsxLDQ2IEBACisKKy8vIENvcHlyaWdodCAoQykgMjAwOS0yMDEyIExvcmVuem8gQ2FtaW5pdGkKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMAorLy8gKHNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLyBIb21lIGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eS9pZGVudGl0eV90eXBlCisKKy8qKiBAZmlsZQorV3JhcCB0eXBlIGV4cHJlc3Npb25zIHdpdGggcm91bmQgcGFyZW50aGVzaXMgc28gdGhleSBjYW4gYmUgcGFzc2VkIHRvIG1hY3JvcworZXZlbiBpZiB0aGV5IGNvbnRhaW4gY29tbWFzLgorKi8KKworI2lmbmRlZiBCT09TVF9JREVOVElUWV9UWVBFX0hQUF8KKyNkZWZpbmUgQk9PU1RfSURFTlRJVFlfVFlQRV9IUFBfCisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9mdW5jdGlvbl90cmFpdHMuaHBwPgorCisvKioKK0BicmllZiBUaGlzIG1hY3JvIGFsbG93cyB0byB3cmFwIHRoZSBzcGVjaWZpZWQgdHlwZSBleHByZXNzaW9uIHdpdGhpbiBleHRyYQorcm91bmQgcGFyZW50aGVzaXMgc28gdGhlIHR5cGUgY2FuIGJlIHBhc3NlZCBhcyBhIHNpbmdsZSBtYWNybyBwYXJhbWV0ZXIgZXZlbiBpZgoraXQgY29udGFpbnMgY29tbWFzIChub3QgYWxyZWFkeSB3cmFwcGVkIHdpdGhpbiByb3VuZCBwYXJlbnRoZXNpcykuCisKK0BQYXJhbXMKK0BQYXJhbXtwYXJlbnRoZXNpemVkX3R5cGUsCitUaGUgdHlwZSBleHByZXNzaW9uIHRvIGJlIHBhc3NlZCBhcyBtYWNybyBwYXJhbWV0ZXIgd3JhcHBlZCBieSBhIHNpbmdsZSBzZXQKK29mIHJvdW5kIHBhcmVudGhlc2lzIDxjPiguLi4pPC9jPi4KK1RoaXMgdHlwZSBleHByZXNzaW9uIGNhbiBjb250YWluIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgY29tbWFzLgorfQorQEVuZFBhcmFtcworCitUaGlzIG1hY3JvIHdvcmtzIG9uIGFueSBDKyswMyBjb21waWxlciAoaXQgZG9lcyBub3QgdXNlIHZhcmlhZGljIG1hY3JvcykuCisKK1RoaXMgbWFjcm8gbXVzdCBiZSBwcmVmaXhlZCBieSA8Yz50eXBlbmFtZTwvYz4gd2hlbiB1c2VkIHdpdGhpbiB0ZW1wbGF0ZXMuCitOb3RlIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgbm90IGJlIGFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgZnVuY3Rpb24KK3RlbXBsYXRlIHBhcmFtZXRlcnMgd2hlbiB0aGV5IGFyZSB3cmFwcGVkIHdpdGggdGhpcyBtYWNybyAodGhlc2UgcGFyYW1ldGVycworbmVlZCB0byBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHRlbXBsYXRlKS4KKworT24gc29tZSBjb21waWxlcnMgKGxpa2UgR0NDKSwgdXNpbmcgdGhpcyBtYWNybyBvbiBhYnN0cmFjdCB0eXBlcyByZXF1aXJlcyB0bworYWRkIGFuZCByZW1vdmUgYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorKi8KKyNkZWZpbmUgQk9PU1RfSURFTlRJVFlfVFlQRShwYXJlbnRoZXNpemVkX3R5cGUpIFwKKyAgICAvKiBtdXN0IE5PVCBwcmVmaXggdGhpcyB3aXRoIGA6OmAgdG8gd29yayB3aXRoIHBhcmVudGhlc2l6ZWQgc3ludGF4ICovIFwKKyAgICBib29zdDo6ZnVuY3Rpb25fdHJhaXRzPCB2b2lkIHBhcmVudGhlc2l6ZWRfdHlwZSA+OjphcmcxX3R5cGUKKworI2VuZGlmIC8vICNpbmNsdWRlIGd1YXJkCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9pbl9wbGFjZV9mYWN0b3J5LmhwcCBiL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9pbl9wbGFjZV9mYWN0b3J5LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTYyYWNlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L2luX3BsYWNlX2ZhY3RvcnkuaHBwCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwMywgRmVybmFuZG8gTHVpcyBDYWNjaW9sYSBDYXJiYWxsYWwuCisvLyBDb3B5cmlnaHQgKEMpIDIwMDcsIFRvYmlhcyBTY2h3aW5nZXIuCisvLworLy8gVXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKy8vIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLworLy8gU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvb3B0aW9uYWwgZm9yIGRvY3VtZW50YXRpb24uCisvLworLy8gWW91IGFyZSB3ZWxjb21lIHRvIGNvbnRhY3QgdGhlIGF1dGhvciBhdDoKKy8vICBmZXJuYW5kb19jYWNjaW9sYUBob3RtYWlsLmNvbQorLy8KKyNpZm5kZWYgQk9PU1RfVVRJTElUWV9JTlBMQUNFX0ZBQ1RPUllfMDRBUFIyMDA3X0hQUAorI2lmbmRlZiBCT09TVF9QUF9JU19JVEVSQVRJTkcKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZGV0YWlsL2luX3BsYWNlX2ZhY3RvcnlfcHJlZml4LmhwcD4KKworbmFtZXNwYWNlIGJvb3N0IHsKKworY2xhc3MgaW5fcGxhY2VfZmFjdG9yeV9iYXNlIHt9IDsKKworI2RlZmluZSAgQk9PU1RfUFBfSVRFUkFUSU9OX0xJTUlUUyAoMCwgQk9PU1RfTUFYX0lOUExBQ0VfRkFDVE9SWV9BUklUWSkKKyNkZWZpbmUgIEJPT1NUX1BQX0ZJTEVOQU1FXzEgPGJvb3N0L3V0aWxpdHkvaW5fcGxhY2VfZmFjdG9yeS5ocHA+CisjaW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKKworfSAvLyBuYW1lc3BhY2UgYm9vc3QKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZGV0YWlsL2luX3BsYWNlX2ZhY3Rvcnlfc3VmZml4LmhwcD4KKworI2RlZmluZSBCT09TVF9VVElMSVRZX0lOUExBQ0VfRkFDVE9SWV8wNEFQUjIwMDdfSFBQCisjZWxzZQorI2RlZmluZSBOIEJPT1NUX1BQX0lURVJBVElPTigpCisKKyNpZiBOCit0ZW1wbGF0ZTwgQk9PU1RfUFBfRU5VTV9QQVJBTVMoTiwgY2xhc3MgQSkgPgorI2VuZGlmCitjbGFzcyBCT09TVF9QUF9DQVQoaW5fcGxhY2VfZmFjdG9yeSxOKQorICA6IAorICBwdWJsaWMgaW5fcGxhY2VfZmFjdG9yeV9iYXNlCit7CitwdWJsaWM6CisKKyAgZXhwbGljaXQgQk9PU1RfUFBfQ0FUKGluX3BsYWNlX2ZhY3RvcnksTikKKyAgICAgICggQk9PU1RfUFBfRU5VTV9CSU5BUllfUEFSQU1TKE4sQSxjb25zdCYgYSkgKQorI2lmIE4gPiAwCisgICAgOiBCT09TVF9QUF9FTlVNKE4sIEJPT1NUX0RFRklORV9JTlBMQUNFX0ZBQ1RPUllfQ0xBU1NfTUVNQkVSX0lOSVQsIF8pCisjZW5kaWYKKyAge30KKworICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB2b2lkKiBhcHBseSh2b2lkKiBhZGRyZXNzKSBjb25zdAorICB7CisgICAgcmV0dXJuIG5ldyhhZGRyZXNzKSBUKCBCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBtX2EpICk7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBUPgorICB2b2lkKiBhcHBseSh2b2lkKiBhZGRyZXNzLCBzdGQ6OnNpemVfdCBuKSBjb25zdAorICB7CisgICAgZm9yKGNoYXIqIG5leHQgPSBhZGRyZXNzID0gdGhpcy0+Qk9PU1RfTkVTVEVEX1RFTVBMQVRFIGFwcGx5PFQ+KGFkZHJlc3MpOworICAgICAgICAhISAtLW47KQorICAgICAgdGhpcy0+Qk9PU1RfTkVTVEVEX1RFTVBMQVRFIGFwcGx5PFQ+KG5leHQgPSBuZXh0K3NpemVvZihUKSk7CisgICAgcmV0dXJuIGFkZHJlc3M7IAorICB9CisKKyAgQk9PU1RfUFBfUkVQRUFUKE4sIEJPT1NUX0RFRklORV9JTlBMQUNFX0ZBQ1RPUllfQ0xBU1NfTUVNQkVSX0RFQ0wsIF8pCit9OworCisjaWYgTiA+IDAKK3RlbXBsYXRlPCBCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBjbGFzcyBBKSA+CitpbmxpbmUgQk9PU1RfUFBfQ0FUKGluX3BsYWNlX2ZhY3RvcnksTik8IEJPT1NUX1BQX0VOVU1fUEFSQU1TKE4sIEEpID4KK2luX3BsYWNlKCBCT09TVF9QUF9FTlVNX0JJTkFSWV9QQVJBTVMoTiwgQSwgY29uc3QmIGEpICkKK3sKKyAgcmV0dXJuIEJPT1NUX1BQX0NBVChpbl9wbGFjZV9mYWN0b3J5LE4pPCBCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBBKSA+CisgICAgICAoIEJPT1NUX1BQX0VOVU1fUEFSQU1TKE4sIGEpICk7Cit9CisjZWxzZQoraW5saW5lIGluX3BsYWNlX2ZhY3RvcnkwIGluX3BsYWNlKCkKK3sKKyAgcmV0dXJuIGluX3BsYWNlX2ZhY3RvcnkwKCk7Cit9CisjZW5kaWYKKworI3VuZGVmIE4KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9yZXN1bHRfb2YuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3Jlc3VsdF9vZi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2NTJiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9yZXN1bHRfb2YuaHBwCkBAIC0wLDAgKzEsMjM0IEBACisvLyBCb29zdCByZXN1bHRfb2YgbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDQuIFVzZSwgbW9kaWZpY2F0aW9uIGFuZAorLy8gIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uCisvLyAgMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eQorI2lmbmRlZiBCT09TVF9SRVNVTFRfT0ZfSFBQCisjZGVmaW5lIEJPT1NUX1JFU1VMVF9PRl9IUFAKKworI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2NhdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2l0ZXJhdGlvbi9pdGVyYXRlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9lbnVtX3BhcmFtcy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV90cmFpbGluZ19wYXJhbXMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ByZXByb2Nlc3Nvci9yZXBldGl0aW9uL2VudW1fYmluYXJ5X3BhcmFtcy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV9zaGlmdGVkX3BhcmFtcy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcHJlcHJvY2Vzc29yL2ZhY2lsaXRpZXMvaW50ZXJjZXB0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvd29ya2Fyb3VuZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY2xhc3MuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3BvaW50ZXIuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX21lbWJlcl9mdW5jdGlvbl9wb2ludGVyLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfY3YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL3JlbW92ZV9yZWZlcmVuY2UuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2RlY2x2YWwuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2NvbmRpdGlvbmFsLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy90eXBlX2lkZW50aXR5LmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pbnRlZ3JhbF9jb25zdGFudC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29yZS9lbmFibGVfaWYuaHBwPgorCisjaWZuZGVmIEJPT1NUX1JFU1VMVF9PRl9OVU1fQVJHUworIyAgZGVmaW5lIEJPT1NUX1JFU1VMVF9PRl9OVU1fQVJHUyAxNgorI2VuZGlmCisKKy8vIFVzZSB0aGUgZGVjbHR5cGUtYmFzZWQgdmVyc2lvbiBvZiByZXN1bHRfb2YgYnkgZGVmYXVsdCBpZiB0aGUgY29tcGlsZXIKKy8vIHN1cHBvcnRzIE4zMjc2IDxodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9KVEMxL1NDMjIvV0cyMS9kb2NzL3BhcGVycy8yMDExL24zMjc2LnBkZj4uCisvLyBUaGUgdXNlciBjYW4gZm9yY2UgdGhlIGNob2ljZSBieSBkZWZpbmluZyBCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFLAorLy8gQk9PU1RfUkVTVUxUX09GX1VTRV9UUjEsIG9yIEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0sgYnV0IG5vdCBtb3JlIHRoYW4gb25lIQorI2lmIChkZWZpbmVkKEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUpICYmIGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9UUjEpKSB8fCBcCisgICAgKGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRSkgJiYgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLKSkgfHwgXAorICAgIChkZWZpbmVkKEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxKSAmJiBkZWZpbmVkKEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0spKQorIyAgZXJyb3IgTW9yZSB0aGFuIG9uZSBvZiBCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFLCBCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMSBhbmQgXAorICBCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLIGNhbm5vdCBiZSBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCisjZW5kaWYKKworI2lmbmRlZiBCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMQorIyAgaWZuZGVmIEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUKKyMgICAgaWZuZGVmIEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0sKKyMgICAgICBpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfREVDTFRZUEVfTjMyNzYgLy8gdGhpcyBpbXBsaWVzICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX0RFQ0xUWVBFKQorIyAgICAgICAgZGVmaW5lIEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUKKyMgICAgICBlbHNlCisjICAgICAgICBkZWZpbmUgQk9PU1RfUkVTVUxUX09GX1VTRV9UUjEKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgYm9vc3QgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdHJ1Y3QgcmVzdWx0X29mOwordGVtcGxhdGU8dHlwZW5hbWUgRj4gc3RydWN0IHRyMV9yZXN1bHRfb2Y7IC8vIGEgVFIxLXN0eWxlIGltcGxlbWVudGF0aW9uIG9mIHJlc3VsdF9vZgorCisjaWYgIWRlZmluZWQoQk9PU1RfTk9fU0ZJTkFFKQorbmFtZXNwYWNlIGRldGFpbCB7CisKK3R5cGVkZWYgY2hhciByZXN1bHRfb2ZfeWVzX3R5cGU7ICAgICAgLy8gc2l6ZW9mKHJlc3VsdF9vZl95ZXNfdHlwZSkgPT0gMQordHlwZWRlZiBjaGFyICgmcmVzdWx0X29mX25vX3R5cGUpWzJdOyAvLyBzaXplb2YocmVzdWx0X29mX25vX3R5cGUpICA9PSAyCisKK3RlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCByZXN1bHRfb2ZfaGFzX3R5cGUge307CisKK3RlbXBsYXRlPGNsYXNzIFQ+IHN0cnVjdCByZXN1bHRfb2ZfaGFzX3Jlc3VsdF90eXBlX2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBzdGF0aWMgcmVzdWx0X29mX3llc190eXBlIGYoIHJlc3VsdF9vZl9oYXNfdHlwZTx0eXBlbmFtZSBVOjpyZXN1bHRfdHlwZT4qICk7CisgICAgdGVtcGxhdGU8Y2xhc3MgVT4gc3RhdGljIHJlc3VsdF9vZl9ub190eXBlIGYoIC4uLiApOworCisgICAgdHlwZWRlZiBib29zdDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc2l6ZW9mKGY8VD4oMCkpID09IHNpemVvZihyZXN1bHRfb2ZfeWVzX3R5cGUpPiB0eXBlOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IHJlc3VsdF9vZl9oYXNfcmVzdWx0X3R5cGU6IHJlc3VsdF9vZl9oYXNfcmVzdWx0X3R5cGVfaW1wbDxUPjo6dHlwZQoreworfTsKKworLy8gV29yayBhcm91bmQgYSBudmNjIGJ1ZyBieSBvbmx5IGRlZmluaW5nIGhhc19yZXN1bHQgd2hlbiBpdCdzIG5lZWRlZC4KKyNpZmRlZiBCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLCisKK3RlbXBsYXRlPHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBDPiBzdHJ1Y3QgcmVzdWx0X29mX2hhc190ZW1wbGF0ZSB7fTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gc3RydWN0IHJlc3VsdF9vZl9oYXNfcmVzdWx0X2ltcGwKK3sKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBzdGF0aWMgcmVzdWx0X29mX3llc190eXBlIGYoIHJlc3VsdF9vZl9oYXNfdGVtcGxhdGU8VTo6dGVtcGxhdGUgcmVzdWx0PiogKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBVPiBzdGF0aWMgcmVzdWx0X29mX25vX3R5cGUgZiggLi4uICk7CisKKyAgICB0eXBlZGVmIGJvb3N0OjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzaXplb2YoZjxUPigwKSkgPT0gc2l6ZW9mKHJlc3VsdF9vZl95ZXNfdHlwZSk+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgcmVzdWx0X29mX2hhc19yZXN1bHQ6IHJlc3VsdF9vZl9oYXNfcmVzdWx0X2ltcGw8VD46OnR5cGUKK3sKK307CisKKyNlbmRpZgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGQXJncywgYm9vbCBIYXNSZXN1bHRUeXBlPiBzdHJ1Y3QgdHIxX3Jlc3VsdF9vZl9pbXBsOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdHJ1Y3QgY3BwMHhfcmVzdWx0X29mOworCisjaWZkZWYgQk9PU1RfTk9fU0ZJTkFFX0VYUFIKKworLy8gVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBvdGhlciB3YXkgdG8gdHVybiB0aGlzIG9mZiBzdWNoIHRoYXQgdGhlIHByZXNlbmNlIG9mCisvLyB0aGUgdXNlci1kZWZpbmVkIG9wZXJhdG9yLCgpIGJlbG93IGRvZXNuJ3QgY2F1c2Ugc3B1cmlvdXMgd2FybmluZyBhbGwgb3ZlciB0aGUgcGxhY2UsCisvLyBzbyB1bmNvbmRpdGlvbmFsbHkgdHVybiBpdCBvZmYuCisjaWYgQk9PU1RfTVNWQworIyAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDkxMykgLy8gdXNlciBkZWZpbmVkIGJpbmFyeSBvcGVyYXRvciAnLCcgZXhpc3RzIGJ1dCBubyBvdmVybG9hZCBjb3VsZCBjb252ZXJ0IGFsbCBvcGVyYW5kcywgZGVmYXVsdCBidWlsdC1pbiBiaW5hcnkgb3BlcmF0b3IgJywnIHVzZWQKKyNlbmRpZgorCitzdHJ1Y3QgcmVzdWx0X29mX3ByaXZhdGVfdHlwZSB7fTsKKworc3RydWN0IHJlc3VsdF9vZl93ZWlyZF90eXBlIHsKKyAgZnJpZW5kIHJlc3VsdF9vZl9wcml2YXRlX3R5cGUgb3BlcmF0b3IsKHJlc3VsdF9vZl9wcml2YXRlX3R5cGUsIHJlc3VsdF9vZl93ZWlyZF90eXBlKTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CityZXN1bHRfb2Zfbm9fdHlwZSByZXN1bHRfb2ZfaXNfcHJpdmF0ZV90eXBlKFQgY29uc3QgJik7CityZXN1bHRfb2ZfeWVzX3R5cGUgcmVzdWx0X29mX2lzX3ByaXZhdGVfdHlwZShyZXN1bHRfb2ZfcHJpdmF0ZV90eXBlKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCByZXN1bHRfb2ZfY2FsbGFibGVfY2xhc3MgOiBDIHsKKyAgICByZXN1bHRfb2ZfY2FsbGFibGVfY2xhc3MoKTsKKyAgICB0eXBlZGVmIHJlc3VsdF9vZl9wcml2YXRlX3R5cGUgY29uc3QgJigqcGZuX3QpKC4uLik7CisgICAgb3BlcmF0b3IgcGZuX3QoKSBjb25zdCB2b2xhdGlsZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitzdHJ1Y3QgcmVzdWx0X29mX3dyYXBfY2FsbGFibGVfY2xhc3MgeworICB0eXBlZGVmIHJlc3VsdF9vZl9jYWxsYWJsZV9jbGFzczxDPiB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCByZXN1bHRfb2Zfd3JhcF9jYWxsYWJsZV9jbGFzczxDIGNvbnN0PiB7CisgIHR5cGVkZWYgcmVzdWx0X29mX2NhbGxhYmxlX2NsYXNzPEM+IGNvbnN0IHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorc3RydWN0IHJlc3VsdF9vZl93cmFwX2NhbGxhYmxlX2NsYXNzPEMgdm9sYXRpbGU+IHsKKyAgdHlwZWRlZiByZXN1bHRfb2ZfY2FsbGFibGVfY2xhc3M8Qz4gdm9sYXRpbGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitzdHJ1Y3QgcmVzdWx0X29mX3dyYXBfY2FsbGFibGVfY2xhc3M8QyBjb25zdCB2b2xhdGlsZT4geworICB0eXBlZGVmIHJlc3VsdF9vZl9jYWxsYWJsZV9jbGFzczxDPiBjb25zdCB2b2xhdGlsZSB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCByZXN1bHRfb2Zfd3JhcF9jYWxsYWJsZV9jbGFzczxDICY+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSByZXN1bHRfb2Zfd3JhcF9jYWxsYWJsZV9jbGFzczxDPjo6dHlwZSAmdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEYsIGJvb2wgVGVzdENhbGxhYmlsaXR5ID0gdHJ1ZT4gc3RydWN0IGNwcDB4X3Jlc3VsdF9vZl9pbXBsOworCisjZWxzZSAvLyBCT09TVF9OT19TRklOQUVfRVhQUgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHJlc3VsdF9vZl9hbHdheXNfdm9pZAoreworICB0eXBlZGVmIHZvaWQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEYsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+IHN0cnVjdCBjcHAweF9yZXN1bHRfb2ZfaW1wbCB7fTsKKworI2VuZGlmIC8vIEJPT1NUX05PX1NGSU5BRV9FWFBSCisKK3RlbXBsYXRlPHR5cGVuYW1lIEY+CitzdHJ1Y3QgcmVzdWx0X29mX3ZvaWRfaW1wbAoreworICB0eXBlZGVmIHZvaWQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFI+CitzdHJ1Y3QgcmVzdWx0X29mX3ZvaWRfaW1wbDxSICgqKSh2b2lkKT4KK3sKKyAgdHlwZWRlZiBSIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSPgorc3RydWN0IHJlc3VsdF9vZl92b2lkX2ltcGw8UiAoJikodm9pZCk+Cit7CisgIHR5cGVkZWYgUiB0eXBlOworfTsKKworLy8gRGV0ZXJtaW5lIHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgb3IgcG9pbnRlciB0byBtZW1iZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGQXJncz4KK3N0cnVjdCByZXN1bHRfb2ZfcG9pbnRlcgorICA6IHRyMV9yZXN1bHRfb2ZfaW1wbDx0eXBlbmFtZSByZW1vdmVfY3Y8Rj46OnR5cGUsIEZBcmdzLCBmYWxzZT4geyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGQXJncz4KK3N0cnVjdCB0cjFfcmVzdWx0X29mX2ltcGw8RiwgRkFyZ3MsIHRydWU+Cit7CisgIHR5cGVkZWYgdHlwZW5hbWUgRjo6cmVzdWx0X3R5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZBcmdzPgorc3RydWN0IGlzX2Z1bmN0aW9uX3dpdGhfbm9fYXJncyA6IGZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEY+CitzdHJ1Y3QgaXNfZnVuY3Rpb25fd2l0aF9ub19hcmdzPEYodm9pZCk+IDogdHJ1ZV90eXBlIHt9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGQXJncz4KK3N0cnVjdCByZXN1bHRfb2ZfbmVzdGVkX3Jlc3VsdCA6IEY6OnRlbXBsYXRlIHJlc3VsdDxGQXJncz4KK3t9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGLCB0eXBlbmFtZSBGQXJncz4KK3N0cnVjdCB0cjFfcmVzdWx0X29mX2ltcGw8RiwgRkFyZ3MsIGZhbHNlPgorICA6IGNvbmRpdGlvbmFsPGlzX2Z1bmN0aW9uX3dpdGhfbm9fYXJnczxGQXJncz46OnZhbHVlLAorICAgICAgICAgICAgIHJlc3VsdF9vZl92b2lkX2ltcGw8Rj4sCisgICAgICAgICAgICAgcmVzdWx0X29mX25lc3RlZF9yZXN1bHQ8RiwgRkFyZ3M+ID46OnR5cGUKK3t9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKyNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18xICgzLCgwLEJPT1NUX1JFU1VMVF9PRl9OVU1fQVJHUyw8Ym9vc3QvdXRpbGl0eS9kZXRhaWwvcmVzdWx0X29mX2l0ZXJhdGUuaHBwPikpCisjaW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKKworI2lmIDAKKy8vIGluZm9ybSBkZXBlbmRlbmN5IHRyYWNrZXJzLCBhcyB0aGV5IGNhbid0IHNlZSB0aHJvdWdoIG1hY3JvIGluY2x1ZGVzCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9kZXRhaWwvcmVzdWx0X29mX2l0ZXJhdGUuaHBwPgorI2VuZGlmCisKKyNlbHNlCisjICBkZWZpbmUgQk9PU1RfTk9fUkVTVUxUX09GIDEKKyNlbmRpZgorCit9CisKKyNlbmRpZiAvLyBCT09TVF9SRVNVTFRfT0ZfSFBQCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzNGU1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9zdHJpbmdfcmVmLmhwcApAQCAtMCwwICsxLDU1MyBAQAorLyoKKyAgIENvcHlyaWdodCAoYykgTWFyc2hhbGwgQ2xvdyAyMDEyLTIwMTUuCisKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisgICAgQmFzZWQgb24gdGhlIFN0cmluZ1JlZiBpbXBsZW1lbnRhdGlvbiBpbiBMTFZNIChodHRwOi8vbGx2bS5vcmcpIGFuZAorICAgIE4zNDIyIGJ5IEplZmZyZXkgWWFzc2tpbgorICAgICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDEyL24zNDQyLmh0bWwKKworKi8KKworI2lmbmRlZiBCT09TVF9TVFJJTkdfUkVGX0hQUAorI2RlZmluZSBCT09TVF9TVFJJTkdfUkVGX0hQUAorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvd29ya2Fyb3VuZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9zdHJpbmdfcmVmX2Z3ZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyb3dfZXhjZXB0aW9uLmhwcD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zZndkPgorCisjaWYgZGVmaW5lZChCT09TVF9OT19DWFgxMV9ERUZBVUxURURfRlVOQ1RJT05TKSB8fCAoZGVmaW5lZChCT09TVF9HQ0MpICYmICgoQk9PU1RfR0NDKzApIC8gMTAwKSA8PSA0MDYpCisvLyBHQ0MgNC42IGNhbm5vdCBoYW5kbGUgYSBkZWZhdWx0ZWQgZnVuY3Rpb24gd2l0aCBub2V4Y2VwdCBzcGVjaWZpZXIKKyNkZWZpbmUgQk9PU1RfU1RSSU5HX1JFRl9OT19DWFgxMV9ERUZBVUxURURfTk9FWENFUFRfRlVOQ1RJT05TCisjZW5kaWYKKworbmFtZXNwYWNlIGJvb3N0IHsKKworICAgIG5hbWVzcGFjZSBkZXRhaWwgeworICAgIC8vICBBIGhlbHBlciBmdW5jdG9yIGJlY2F1c2Ugc29tZXRpbWVzIHdlIGRvbid0IGhhdmUgbGFtYmRhcworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICAgICAgY2xhc3Mgc3RyaW5nX3JlZl90cmFpdHNfZXEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdHJpbmdfcmVmX3RyYWl0c19lcSAoIGNoYXJUIGNoICkgOiBjaF8oY2gpIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yICgpICggY2hhclQgdmFsICkgY29uc3QgeyByZXR1cm4gdHJhaXRzOjplcSAoIGNoXywgdmFsICk7IH0KKyAgICAgICAgICAgIGNoYXJUIGNoXzsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgY2xhc3MgYmFzaWNfc3RyaW5nX3JlZiB7CisgICAgcHVibGljOgorICAgICAgICAvLyB0eXBlcworICAgICAgICB0eXBlZGVmIGNoYXJUIHZhbHVlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgY29uc3QgY2hhclQqIHBvaW50ZXI7CisgICAgICAgIHR5cGVkZWYgY29uc3QgY2hhclQmIHJlZmVyZW5jZTsKKyAgICAgICAgdHlwZWRlZiBjb25zdCBjaGFyVCYgY29uc3RfcmVmZXJlbmNlOworICAgICAgICB0eXBlZGVmIHBvaW50ZXIgY29uc3RfaXRlcmF0b3I7IC8vIGltcGwtZGVmaW5lZAorICAgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgICAgdHlwZWRlZiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgICAgICAgIHR5cGVkZWYgc3RkOjpzaXplX3Qgc2l6ZV90eXBlOworICAgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgICAgc3RhdGljIEJPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBzaXplX3R5cGUgbnBvcyA9IHNpemVfdHlwZSgtMSk7CisKKyAgICAgICAgLy8gY29uc3RydWN0L2NvcHkKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGJhc2ljX3N0cmluZ19yZWYgKCkgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIDogcHRyXyhOVUxMKSwgbGVuXygwKSB7fQorCisgICAgICAgIC8vIGJ5IGRlZmF1bHRpbmcgdGhlc2UgZnVuY3Rpb25zLCBiYXNpY19zdHJpbmdfcmVmIGJlY29tZXMKKyAgICAgICAgLy8gIHRyaXZpYWxseSBjb3B5L21vdmUgY29uc3RydWN0aWJsZS4KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGJhc2ljX3N0cmluZ19yZWYgKGNvbnN0IGJhc2ljX3N0cmluZ19yZWYgJnJocykgQk9PU1RfTk9FWENFUFQKKyNpZm5kZWYgQk9PU1RfU1RSSU5HX1JFRl9OT19DWFgxMV9ERUZBVUxURURfTk9FWENFUFRfRlVOQ1RJT05TCisgICAgICAgICAgICA9IGRlZmF1bHQ7CisjZWxzZQorICAgICAgICAgICAgOiBwdHJfKHJocy5wdHJfKSwgbGVuXyhyaHMubGVuXykge30KKyNlbmRpZgorCisgICAgICAgIGJhc2ljX3N0cmluZ19yZWYmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmdfcmVmICZyaHMpIEJPT1NUX05PRVhDRVBUCisjaWZuZGVmIEJPT1NUX1NUUklOR19SRUZfTk9fQ1hYMTFfREVGQVVMVEVEX05PRVhDRVBUX0ZVTkNUSU9OUworICAgICAgICAgICAgPSBkZWZhdWx0OworI2Vsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB0cl8gPSByaHMucHRyXzsKKyAgICAgICAgICAgIGxlbl8gPSByaHMubGVuXzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGJhc2ljX3N0cmluZ19yZWYoY29uc3QgY2hhclQqIHN0cikgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIDogcHRyXyhzdHIpLCBsZW5fKHRyYWl0czo6bGVuZ3RoKHN0cikpIHt9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgICBiYXNpY19zdHJpbmdfcmVmKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHN0cikKKyAgICAgICAgICAgIDogcHRyXyhzdHIuZGF0YSgpKSwgbGVuXyhzdHIubGVuZ3RoKCkpIHt9CisKKy8vICNpZiAhZGVmaW5lZChCT09TVF9OT19DWFgxMV9SVkFMVUVfUkVGRVJFTkNFUykgJiYgIWRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfREVMRVRFRF9GVU5DVElPTlMpCisvLyAgICAgICAgIC8vIENvbnN0cnVjdGluZyBhIHN0cmluZ19yZWYgZnJvbSBhIHRlbXBvcmFyeSBzdHJpbmcgaXMgYSBiYWQgaWRlYQorLy8gICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3I+CisvLyAgICAgICAgIGJhc2ljX3N0cmluZ19yZWYoICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYmKQorLy8gICAgICAgICAgICAgPSBkZWxldGU7CisvLyAjZW5kaWYKKworICAgICAgICBCT09TVF9DT05TVEVYUFIgYmFzaWNfc3RyaW5nX3JlZihjb25zdCBjaGFyVCogc3RyLCBzaXplX3R5cGUgbGVuKSBCT09TVF9OT0VYQ0VQVAorICAgICAgICAgICAgOiBwdHJfKHN0ciksIGxlbl8obGVuKSB7fQorCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX0VYUExJQ0lUX0NPTlZFUlNJT05fT1BFUkFUT1JTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgZXhwbGljaXQgb3BlcmF0b3Igc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICggYmVnaW4oKSwgZW5kKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cz4gdG9fc3RyaW5nICgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzPiAoIGJlZ2luKCksIGVuZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBpdGVyYXRvcnMKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0X2l0ZXJhdG9yICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9pdGVyYXRvciAgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfaXRlcmF0b3IgICAgIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHB0cl8gKyBsZW5fOyB9CisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9pdGVyYXRvciAgICBjZW5kKCkgY29uc3QgeyByZXR1cm4gcHRyXyArIGxlbl87IH0KKyAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICByYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIChlbmQoKSk7IH0KKyAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIChlbmQoKSk7IH0KKyAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgIHJlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIChiZWdpbigpKTsgfQorICAgICAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICBjcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgKGJlZ2luKCkpOyB9CisKKyAgICAgICAgLy8gY2FwYWNpdHkKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBzaXplKCkgICAgIGNvbnN0IHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBsZW5ndGgoKSAgIGNvbnN0IHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGJvb2wgZW1wdHkoKSAgICAgICAgIGNvbnN0IHsgcmV0dXJuIGxlbl8gPT0gMDsgfQorCisgICAgICAgIC8vIGVsZW1lbnQgYWNjZXNzCisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdCBjaGFyVCYgb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKSBjb25zdCB7IHJldHVybiBwdHJfW3Bvc107IH0KKworICAgICAgICBjb25zdCBjaGFyVCYgYXQoc2l6ZV90IHBvcykgY29uc3QgeworICAgICAgICAgICAgaWYgKCBwb3MgPj0gbGVuXyApCisgICAgICAgICAgICAgICAgQk9PU1RfVEhST1dfRVhDRVBUSU9OKCBzdGQ6Om91dF9vZl9yYW5nZSAoICJib29zdDo6c3RyaW5nX3JlZjo6YXQiICkgKTsKKyAgICAgICAgICAgIHJldHVybiBwdHJfW3Bvc107CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0IGNoYXJUJiBmcm9udCgpIGNvbnN0IHsgcmV0dXJuIHB0cl9bMF07IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0IGNoYXJUJiBiYWNrKCkgIGNvbnN0IHsgcmV0dXJuIHB0cl9bbGVuXy0xXTsgfQorICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3QgY2hhclQqIGRhdGEoKSAgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorCisgICAgICAgIC8vIG1vZGlmaWVycworICAgICAgICB2b2lkIGNsZWFyKCkgeyBsZW5fID0gMDsgfQorICAgICAgICB2b2lkIHJlbW92ZV9wcmVmaXgoc2l6ZV90eXBlIG4pIHsKKyAgICAgICAgICAgIGlmICggbiA+IGxlbl8gKQorICAgICAgICAgICAgICAgIG4gPSBsZW5fOworICAgICAgICAgICAgcHRyXyArPSBuOworICAgICAgICAgICAgbGVuXyAtPSBuOworICAgICAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVtb3ZlX3N1ZmZpeChzaXplX3R5cGUgbikgeworICAgICAgICAgICAgaWYgKCBuID4gbGVuXyApCisgICAgICAgICAgICAgICAgbiA9IGxlbl87CisgICAgICAgICAgICBsZW5fIC09IG47CisgICAgICAgICAgICB9CisKKworICAgICAgICAvLyBiYXNpY19zdHJpbmdfcmVmIHN0cmluZyBvcGVyYXRpb25zCisgICAgICAgIGJhc2ljX3N0cmluZ19yZWYgc3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuPW5wb3MpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICggcG9zID4gc2l6ZSgpKQorICAgICAgICAgICAgICAgIEJPT1NUX1RIUk9XX0VYQ0VQVElPTiggc3RkOjpvdXRfb2ZfcmFuZ2UgKCAic3RyaW5nX3JlZjo6c3Vic3RyIiApICk7CisgICAgICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZihkYXRhKCkgKyBwb3MsIChzdGQ6Om1pbikoc2l6ZSgpIC0gcG9zLCBuKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaW50IGNvbXBhcmUoYmFzaWNfc3RyaW5nX3JlZiB4KSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBpbnQgY21wID0gdHJhaXRzOjpjb21wYXJlICggcHRyXywgeC5wdHJfLCAoc3RkOjptaW4pKGxlbl8sIHgubGVuXykpOworICAgICAgICAgICAgcmV0dXJuIGNtcCAhPSAwID8gY21wIDogKCBsZW5fID09IHgubGVuXyA/IDAgOiBsZW5fIDwgeC5sZW5fID8gLTEgOiAxICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzdGFydHNfd2l0aChjaGFyVCBjKSBjb25zdCB7IHJldHVybiAhZW1wdHkoKSAmJiB0cmFpdHM6OmVxICggYywgZnJvbnQoKSk7IH0KKyAgICAgICAgYm9vbCBzdGFydHNfd2l0aChiYXNpY19zdHJpbmdfcmVmIHgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBsZW5fID49IHgubGVuXyAmJiB0cmFpdHM6OmNvbXBhcmUgKCBwdHJfLCB4LnB0cl8sIHgubGVuXyApID09IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgYm9vbCBlbmRzX3dpdGgoY2hhclQgYykgY29uc3QgeyByZXR1cm4gIWVtcHR5KCkgJiYgdHJhaXRzOjplcSAoIGMsIGJhY2soKSk7IH0KKyAgICAgICAgYm9vbCBlbmRzX3dpdGgoYmFzaWNfc3RyaW5nX3JlZiB4KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbGVuXyA+PSB4Lmxlbl8gJiYgdHJhaXRzOjpjb21wYXJlICggcHRyXyArIGxlbl8gLSB4Lmxlbl8sIHgucHRyXywgeC5sZW5fICkgPT0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICBzaXplX3R5cGUgZmluZChiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzdGQ6OnNlYXJjaCAoIHRoaXMtPmNiZWdpbiAoKSwgdGhpcy0+Y2VuZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY2JlZ2luICgpLCBzLmNlbmQgKCksIHRyYWl0czo6ZXEgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNlbmQgKCkgPyBucG9zIDogc3RkOjpkaXN0YW5jZSAoIHRoaXMtPmNiZWdpbiAoKSwgaXRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgIHNpemVfdHlwZSBmaW5kKGNoYXJUIGMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzdGQ6OmZpbmRfaWYgKCB0aGlzLT5jYmVnaW4gKCksIHRoaXMtPmNlbmQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OnN0cmluZ19yZWZfdHJhaXRzX2VxPGNoYXJULCB0cmFpdHM+ICggYyApKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNlbmQgKCkgPyBucG9zIDogc3RkOjpkaXN0YW5jZSAoIHRoaXMtPmNiZWdpbiAoKSwgaXRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgIHNpemVfdHlwZSByZmluZChiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRlciA9IHN0ZDo6c2VhcmNoICggdGhpcy0+Y3JiZWdpbiAoKSwgdGhpcy0+Y3JlbmQgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNyYmVnaW4gKCksIHMuY3JlbmQgKCksIHRyYWl0czo6ZXEgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNyZW5kICgpID8gbnBvcyA6IChzdGQ6OmRpc3RhbmNlKGl0ZXIsIHRoaXMtPmNyZW5kKCkpIC0gcy5zaXplKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIHNpemVfdHlwZSByZmluZChjaGFyVCBjKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ZXIgPSBzdGQ6OmZpbmRfaWYgKCB0aGlzLT5jcmJlZ2luICgpLCB0aGlzLT5jcmVuZCAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDo6c3RyaW5nX3JlZl90cmFpdHNfZXE8Y2hhclQsIHRyYWl0cz4gKCBjICkpOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIgPT0gdGhpcy0+Y3JlbmQgKCkgPyBucG9zIDogKHRoaXMtPnNpemUoKSAtIDEgLSBzdGQ6OmRpc3RhbmNlKHRoaXMtPmNyYmVnaW4oKSwgaXRlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGNoYXJUIGMpIGNvbnN0IHsgcmV0dXJuICBmaW5kIChjKTsgfQorICAgICAgICBzaXplX3R5cGUgZmluZF9sYXN0X29mIChjaGFyVCBjKSBjb25zdCB7IHJldHVybiByZmluZCAoYyk7IH0KKworICAgICAgICBzaXplX3R5cGUgZmluZF9maXJzdF9vZihiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzdGQ6OmZpbmRfZmlyc3Rfb2YKKyAgICAgICAgICAgICAgICAoIHRoaXMtPmNiZWdpbiAoKSwgdGhpcy0+Y2VuZCAoKSwgcy5jYmVnaW4gKCksIHMuY2VuZCAoKSwgdHJhaXRzOjplcSApOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIgPT0gdGhpcy0+Y2VuZCAoKSA/IG5wb3MgOiBzdGQ6OmRpc3RhbmNlICggdGhpcy0+Y2JlZ2luICgpLCBpdGVyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRlciA9IHN0ZDo6ZmluZF9maXJzdF9vZgorICAgICAgICAgICAgICAgICggdGhpcy0+Y3JiZWdpbiAoKSwgdGhpcy0+Y3JlbmQgKCksIHMuY2JlZ2luICgpLCBzLmNlbmQgKCksIHRyYWl0czo6ZXEgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNyZW5kICgpID8gbnBvcyA6ICh0aGlzLT5zaXplKCkgLSAxIC0gc3RkOjpkaXN0YW5jZSh0aGlzLT5jcmJlZ2luKCksIGl0ZXIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3JlZiBzKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBpdGVyID0gZmluZF9ub3Rfb2YgKCB0aGlzLT5jYmVnaW4gKCksIHRoaXMtPmNlbmQgKCksIHMgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNlbmQgKCkgPyBucG9zIDogc3RkOjpkaXN0YW5jZSAoIHRoaXMtPmNiZWdpbiAoKSwgaXRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyVCBjKSBjb25zdCB7CisgICAgICAgICAgICBmb3IgKCBjb25zdF9pdGVyYXRvciBpdGVyID0gdGhpcy0+Y2JlZ2luICgpOyBpdGVyICE9IHRoaXMtPmNlbmQgKCk7ICsraXRlciApCisgICAgICAgICAgICAgICAgaWYgKCAhdHJhaXRzOjplcSAoIGMsICppdGVyICkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlICggdGhpcy0+Y2JlZ2luICgpLCBpdGVyICk7CisgICAgICAgICAgICByZXR1cm4gbnBvczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihiYXNpY19zdHJpbmdfcmVmIHMpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRlciA9IGZpbmRfbm90X29mICggdGhpcy0+Y3JiZWdpbiAoKSwgdGhpcy0+Y3JlbmQgKCksIHMgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNyZW5kICgpID8gbnBvcyA6ICh0aGlzLT5zaXplKCkgLSAxIC0gc3RkOjpkaXN0YW5jZSh0aGlzLT5jcmJlZ2luKCksIGl0ZXIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjaGFyVCBjKSBjb25zdCB7CisgICAgICAgICAgICBmb3IgKCBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ZXIgPSB0aGlzLT5jcmJlZ2luICgpOyBpdGVyICE9IHRoaXMtPmNyZW5kICgpOyArK2l0ZXIgKQorICAgICAgICAgICAgICAgIGlmICggIXRyYWl0czo6ZXEgKCBjLCAqaXRlciApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c2l6ZSgpIC0gMSAtIHN0ZDo6ZGlzdGFuY2UodGhpcy0+Y3JiZWdpbigpLCBpdGVyKTsKKyAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CisgICAgICAgIEl0ZXJhdG9yIGZpbmRfbm90X29mICggSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGxhc3QsIGJhc2ljX3N0cmluZ19yZWYgcyApIGNvbnN0IHsKKyAgICAgICAgICAgIGZvciAoIDsgZmlyc3QgIT0gbGFzdCA7ICsrZmlyc3QgKQorICAgICAgICAgICAgICAgIGlmICggMCA9PSB0cmFpdHM6OmZpbmQgKCBzLnB0cl8sIHMubGVuXywgKmZpcnN0ICkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICAgICAgICAgIHJldHVybiBsYXN0OworICAgICAgICAgICAgfQorCisKKworICAgICAgICBjb25zdCBjaGFyVCAqcHRyXzsKKyAgICAgICAgc3RkOjpzaXplX3QgbGVuXzsKKyAgICAgICAgfTsKKworCisvLyAgQ29tcGFyaXNvbiBvcGVyYXRvcnMKKy8vICBFcXVhbGl0eQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICBpZiAoIHguc2l6ZSAoKSAhPSB5LnNpemUgKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHguY29tcGFyZSh5KSA9PSAwOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB5KSB7CisgICAgICAgIHJldHVybiB4ID09IGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB4LCBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHkpIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeCkgPT0geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geCwgY29uc3QgY2hhclQgKiB5KSB7CisgICAgICAgIHJldHVybiB4ID09IGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyVCAqIHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih4KSA9PSB5OworICAgICAgICB9CisKKy8vICBJbmVxdWFsaXR5CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geCwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB5KSB7CisgICAgICAgIGlmICggeC5zaXplICgpICE9IHkuc2l6ZSAoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB4LmNvbXBhcmUoeSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeSkgeworICAgICAgICByZXR1cm4geCAhPSBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeCwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB5KSB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHgpICE9IHk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGNvbnN0IGNoYXJUICogeSkgeworICAgICAgICByZXR1cm4geCAhPSBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hhclQgKiB4LCBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHkpIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeCkgIT0geTsKKyAgICAgICAgfQorCisvLyAgTGVzcyB0aGFuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHkpIHsKKyAgICAgICAgcmV0dXJuIHguY29tcGFyZSh5KSA8IDA7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeSkgeworICAgICAgICByZXR1cm4geCA8IGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih4KSA8IHk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geCwgY29uc3QgY2hhclQgKiB5KSB7CisgICAgICAgIHJldHVybiB4IDwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgY2hhclQgKiB4LCBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHkpIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4oeCkgPCB5OworICAgICAgICB9CisKKy8vICBHcmVhdGVyIHRoYW4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4geC5jb21wYXJlKHkpID4gMDsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB5KSB7CisgICAgICAgIHJldHVybiB4ID4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeCwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB5KSB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHgpID4geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBjb25zdCBjaGFyVCAqIHkpIHsKKyAgICAgICAgcmV0dXJuIHggPiBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBjaGFyVCAqIHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih4KSA+IHk7CisgICAgICAgIH0KKworLy8gIExlc3MgdGhhbiBvciBlcXVhbCB0bworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4geC5jb21wYXJlKHkpIDw9IDA7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geCwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHkpIHsKKyAgICAgICAgcmV0dXJuIHggPD0gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih4KSA8PSB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPD0oYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBjb25zdCBjaGFyVCAqIHkpIHsKKyAgICAgICAgcmV0dXJuIHggPD0gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGNoYXJUICogeCwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB5KSB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHgpIDw9IHk7CisgICAgICAgIH0KKworLy8gIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+IHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4geC5jb21wYXJlKHkpID49IDA7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geCwgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHkpIHsKKyAgICAgICAgcmV0dXJuIHggPj0gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsIGJhc2ljX3N0cmluZ19yZWY8Y2hhclQsIHRyYWl0cz4geSkgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih4KSA+PSB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB4LCBjb25zdCBjaGFyVCAqIHkpIHsKKyAgICAgICAgcmV0dXJuIHggPj0gYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGNoYXJUICogeCwgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCwgdHJhaXRzPiB5KSB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfcmVmPGNoYXJULCB0cmFpdHM+KHgpID49IHk7CisgICAgICAgIH0KKworICAgIG5hbWVzcGFjZSBkZXRhaWwgeworCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgICAgIGlubGluZSB2b2lkIHNyX2luc2VydF9maWxsX2NoYXJzKHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsIHN0ZDo6c2l6ZV90IG4pIHsKKyAgICAgICAgICAgIGVudW0geyBjaHVua19zaXplID0gOCB9OworICAgICAgICAgICAgY2hhclQgZmlsbF9jaGFyc1tjaHVua19zaXplXTsKKyAgICAgICAgICAgIHN0ZDo6ZmlsbF9uKGZpbGxfY2hhcnMsIHN0YXRpY19jYXN0PCBzdGQ6OnNpemVfdCA+KGNodW5rX3NpemUpLCBvcy5maWxsKCkpOworICAgICAgICAgICAgZm9yICg7IG4gPj0gY2h1bmtfc2l6ZSAmJiBvcy5nb29kKCk7IG4gLT0gY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICBvcy53cml0ZShmaWxsX2NoYXJzLCBzdGF0aWNfY2FzdDwgc3RkOjpzaXplX3QgPihjaHVua19zaXplKSk7CisgICAgICAgICAgICBpZiAobiA+IDAgJiYgb3MuZ29vZCgpKQorICAgICAgICAgICAgICAgIG9zLndyaXRlKGZpbGxfY2hhcnMsIG4pOworICAgICAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgICAgIHZvaWQgc3JfaW5zZXJ0X2FsaWduZWQoc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywgY29uc3QgYmFzaWNfc3RyaW5nX3JlZjxjaGFyVCx0cmFpdHM+JiBzdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHNpemUgPSBzdHIuc2l6ZSgpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgYWxpZ25tZW50X3NpemUgPSBzdGF0aWNfY2FzdDwgc3RkOjpzaXplX3QgPihvcy53aWR0aCgpKSAtIHNpemU7CisgICAgICAgICAgICBjb25zdCBib29sIGFsaWduX2xlZnQgPSAob3MuZmxhZ3MoKSAmIHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPjo6YWRqdXN0ZmllbGQpID09IHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPjo6bGVmdDsKKyAgICAgICAgICAgIGlmICghYWxpZ25fbGVmdCkgeworICAgICAgICAgICAgICAgIGRldGFpbDo6c3JfaW5zZXJ0X2ZpbGxfY2hhcnMob3MsIGFsaWdubWVudF9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAob3MuZ29vZCgpKQorICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShzdHIuZGF0YSgpLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcy53cml0ZShzdHIuZGF0YSgpLCBzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAob3MuZ29vZCgpKQorICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OnNyX2luc2VydF9maWxsX2NoYXJzKG9zLCBhbGlnbm1lbnRfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIGRldGFpbAorCisgICAgLy8gSW5zZXJ0ZXIKKyAgICB0ZW1wbGF0ZTxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzPgorICAgIGlubGluZSBzdGQ6OmJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mCisgICAgb3BlcmF0b3I8PChzdGQ6OmJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz4mIG9zLCBjb25zdCBiYXNpY19zdHJpbmdfcmVmPGNoYXJULHRyYWl0cz4mIHN0cikgeworICAgICAgICBpZiAob3MuZ29vZCgpKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplID0gc3RyLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHcgPSBzdGF0aWNfY2FzdDwgc3RkOjpzaXplX3QgPihvcy53aWR0aCgpKTsKKyAgICAgICAgICAgIGlmICh3IDw9IHNpemUpCisgICAgICAgICAgICAgICAgb3Mud3JpdGUoc3RyLmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGV0YWlsOjpzcl9pbnNlcnRfYWxpZ25lZChvcywgc3RyKTsKKyAgICAgICAgICAgIG9zLndpZHRoKDApOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAvLyBudW1lcmljIGNvbnZlcnNpb25zCisgICAgLy8KKyAgICAvLyAgVGhlc2UgYXJlIHNob3J0LXRlcm0gaW1wbGVtZW50YXRpb25zLgorICAgIC8vICBJbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIEkgd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb3B5aW5nLgorICAgIC8vCisgICAgaW5saW5lIGludCBzdG9pIChzdHJpbmdfcmVmIHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgbG9uZyBzdG9sIChzdHJpbmdfcmVmIHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvbCAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdG91bCAoc3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b3VsICggc3RkOjpzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGxvbmcgc3RvbGwgKHN0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9sbCAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHN0b3VsbCAoc3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b3VsbCAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgc3RvZiAoc3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvZiAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgZG91YmxlIHN0b2QgKHN0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2QgKCBzdGQ6OnN0cmluZyhzdHIpLCBpZHggKTsKKyAgICAgICAgfQorCisgICAgaW5saW5lIGxvbmcgZG91YmxlIHN0b2xkIChzdHJpbmdfcmVmIHN0ciwgc2l6ZV90KiBpZHg9MCkgIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvbGQgKCBzdGQ6OnN0cmluZyhzdHIpLCBpZHggKTsKKyAgICAgICAgfQorCisgICAgaW5saW5lIGludCAgc3RvaSAod3N0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9pICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgbG9uZyBzdG9sICh3c3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2wgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSB1bnNpZ25lZCBsb25nIHN0b3VsICh3c3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b3VsICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgbG9uZyBsb25nIHN0b2xsICh3c3RyaW5nX3JlZiBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2xsICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHN0b3VsbCAod3N0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG91bGwgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBmbG9hdCAgc3RvZiAod3N0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2YgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4ICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBkb3VibGUgc3RvZCAod3N0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2QgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4ICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGRvdWJsZSBzdG9sZCAod3N0cmluZ19yZWYgc3RyLCBzaXplX3QqIGlkeD0wKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2xkICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCApOworICAgICAgICB9CisjZW5kaWYKKworfQorCisjaWYgMAorbmFtZXNwYWNlIHN0ZCB7CisgICAgLy8gSGFzaGluZworICAgIHRlbXBsYXRlPD4gc3RydWN0IGhhc2g8Ym9vc3Q6OnN0cmluZ19yZWY+OworICAgIHRlbXBsYXRlPD4gc3RydWN0IGhhc2g8Ym9vc3Q6OnUxNnN0cmluZ19yZWY+OworICAgIHRlbXBsYXRlPD4gc3RydWN0IGhhc2g8Ym9vc3Q6OnUzMnN0cmluZ19yZWY+OworICAgIHRlbXBsYXRlPD4gc3RydWN0IGhhc2g8Ym9vc3Q6OndzdHJpbmdfcmVmPjsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm9vc3QvdXRpbGl0eS9zdHJpbmdfcmVmX2Z3ZC5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZl9md2QuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OGI5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZl9md2QuaHBwCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgICBDb3B5cmlnaHQgKGMpIE1hcnNoYWxsIENsb3cgMjAxMi0yMDEyLgorCisgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisgICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKworICAgIEJhc2VkIG9uIHRoZSBTdHJpbmdSZWYgaW1wbGVtZW50YXRpb24gaW4gTExWTSAoaHR0cDovL2xsdm0ub3JnKSBhbmQKKyAgICBOMzQyMiBieSBKZWZmcmV5IFlhc3NraW4KKyAgICAgICAgaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvanRjMS9zYzIyL3dnMjEvZG9jcy9wYXBlcnMvMjAxMi9uMzQ0Mi5odG1sCisKKyovCisKKyNpZm5kZWYgQk9PU1RfU1RSSU5HX1JFRl9GV0RfSFBQCisjZGVmaW5lIEJPT1NUX1NUUklOR19SRUZfRldEX0hQUAorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBib29zdCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxjaGFyVD4gPiBjbGFzcyBiYXNpY19zdHJpbmdfcmVmOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3JlZjxjaGFyLCAgICAgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiA+ICAgICAgICBzdHJpbmdfcmVmOworICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3JlZjx3Y2hhcl90LCAgc3RkOjpjaGFyX3RyYWl0czx3Y2hhcl90PiA+ICAgIHdzdHJpbmdfcmVmOworCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX0NIQVIxNl9UCisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdfcmVmPGNoYXIxNl90LCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXIxNl90PiA+IHUxNnN0cmluZ19yZWY7CisjZW5kaWYKKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9DSEFSMzJfVAorICAgIHR5cGVkZWYgYmFzaWNfc3RyaW5nX3JlZjxjaGFyMzJfdCwgc3RkOjpjaGFyX3RyYWl0czxjaGFyMzJfdD4gPiB1MzJzdHJpbmdfcmVmOworI2VuZGlmCisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3ZpZXcuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3N0cmluZ192aWV3LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVmZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3N0cmluZ192aWV3LmhwcApAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAgIENvcHlyaWdodCAoYykgTWFyc2hhbGwgQ2xvdyAyMDEyLTIwMTUuCisgICBDb3B5cmlnaHQgKGMpIEJlbWFuIERhd2VzIDIwMTUKKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisKKyAgICBCYXNlZCBvbiB0aGUgU3RyaW5nUmVmIGltcGxlbWVudGF0aW9uIGluIExMVk0gKGh0dHA6Ly9sbHZtLm9yZykgYW5kCisgICAgTjM0MjIgYnkgSmVmZnJleSBZYXNza2luCisgICAgICAgIGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTIvbjM0NDIuaHRtbAorICAgIFVwZGF0ZWQgSnVseSAyMDE1IHRvIHJlZmxlY3QgdGhlIExpYnJhcnkgRnVuZGFtZW50YWxzIFRTCisgICAgICAgIGh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTUvbjQ0ODAuaHRtbAorKi8KKworI2lmbmRlZiBCT09TVF9TVFJJTkdfVklFV19IUFAKKyNkZWZpbmUgQk9PU1RfU1RSSU5HX1ZJRVdfSFBQCisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2RldGFpbC93b3JrYXJvdW5kLmhwcD4KKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L3N0cmluZ192aWV3X2Z3ZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdGhyb3dfZXhjZXB0aW9uLmhwcD4KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisKKyNpZiBkZWZpbmVkKEJPT1NUX05PX0NYWDExX0RFRkFVTFRFRF9GVU5DVElPTlMpIHx8IChkZWZpbmVkKEJPT1NUX0dDQykgJiYgKChCT09TVF9HQ0MrMCkgLyAxMDApIDw9IDQwNikKKy8vIEdDQyA0LjYgY2Fubm90IGhhbmRsZSBhIGRlZmF1bHRlZCBmdW5jdGlvbiB3aXRoIG5vZXhjZXB0IHNwZWNpZmllcgorI2RlZmluZSBCT09TVF9TVFJJTkdfVklFV19OT19DWFgxMV9ERUZBVUxURURfTk9FWENFUFRfRlVOQ1RJT05TCisjZW5kaWYKKworbmFtZXNwYWNlIGJvb3N0IHsKKworICAgIG5hbWVzcGFjZSBkZXRhaWwgeworICAgIC8vICBBIGhlbHBlciBmdW5jdG9yIGJlY2F1c2Ugc29tZXRpbWVzIHdlIGRvbid0IGhhdmUgbGFtYmRhcworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICAgICAgY2xhc3Mgc3RyaW5nX3ZpZXdfdHJhaXRzX2VxIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgc3RyaW5nX3ZpZXdfdHJhaXRzX2VxICggY2hhclQgY2ggKSA6IGNoXyhjaCkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IoKSggY2hhclQgdmFsICkgY29uc3QgeyByZXR1cm4gdHJhaXRzOjplcSAoY2hfLCB2YWwpOyB9CisgICAgICAgICAgICBjaGFyVCBjaF87CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPiAgLy8gdHJhaXRzIGRlZmF1bHRlZCBpbiBzdHJpbmdfdmlld19md2QuaHBwCisgICAgY2xhc3MgYmFzaWNfc3RyaW5nX3ZpZXcgeworICAgIHB1YmxpYzoKKyAgICAgIC8vIHR5cGVzCisgICAgICB0eXBlZGVmIHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3R5cGU7CisgICAgICB0eXBlZGVmIGNoYXJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKKyAgICAgIHR5cGVkZWYgY2hhclQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOworICAgICAgdHlwZWRlZiBjb25zdCBjaGFyVCogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3BvaW50ZXI7CisgICAgICB0eXBlZGVmIGNoYXJUJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOworICAgICAgdHlwZWRlZiBjb25zdCBjaGFyVCYgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsKKyAgICAgIHR5cGVkZWYgY29uc3RfcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsgLy8gaW1wbC1kZWZpbmVkCisgICAgICB0eXBlZGVmIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I7CisgICAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICAgIHR5cGVkZWYgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgICAgICAgICByZXZlcnNlX2l0ZXJhdG9yOworICAgICAgdHlwZWRlZiBzdGQ6OnNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZTsKKyAgICAgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CisgICAgICBzdGF0aWMgQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIHNpemVfdHlwZSAgICAgbnBvcyA9IHNpemVfdHlwZSgtMSk7CisKKyAgICAgIC8vIGNvbnN0cnVjdC9jb3B5CisgICAgICBCT09TVF9DT05TVEVYUFIgYmFzaWNfc3RyaW5nX3ZpZXcoKSBCT09TVF9OT0VYQ0VQVAorICAgICAgICA6IHB0cl8oTlVMTCksIGxlbl8oMCkge30KKworICAgICAgLy8gYnkgZGVmYXVsdGluZyB0aGVzZSBmdW5jdGlvbnMsIGJhc2ljX3N0cmluZ19yZWYgYmVjb21lcworICAgICAgLy8gIHRyaXZpYWxseSBjb3B5L21vdmUgY29uc3RydWN0aWJsZS4KKyAgICAgIEJPT1NUX0NPTlNURVhQUiBiYXNpY19zdHJpbmdfdmlldyhjb25zdCBiYXNpY19zdHJpbmdfdmlldyAmcmhzKSBCT09TVF9OT0VYQ0VQVAorI2lmbmRlZiBCT09TVF9TVFJJTkdfVklFV19OT19DWFgxMV9ERUZBVUxURURfTk9FWENFUFRfRlVOQ1RJT05TCisgICAgICAgID0gZGVmYXVsdDsKKyNlbHNlCisgICAgICAgIDogcHRyXyhyaHMucHRyXyksIGxlbl8ocmhzLmxlbl8pIHt9CisjZW5kaWYKKworICAgICAgYmFzaWNfc3RyaW5nX3ZpZXcmIG9wZXJhdG9yPShjb25zdCBiYXNpY19zdHJpbmdfdmlldyAmcmhzKSBCT09TVF9OT0VYQ0VQVAorI2lmbmRlZiBCT09TVF9TVFJJTkdfVklFV19OT19DWFgxMV9ERUZBVUxURURfTk9FWENFUFRfRlVOQ1RJT05TCisgICAgICAgICAgICA9IGRlZmF1bHQ7CisjZWxzZQorICAgICAgICB7CisgICAgICAgIHB0cl8gPSByaHMucHRyXzsKKyAgICAgICAgbGVuXyA9IHJocy5sZW5fOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgICAgIGJhc2ljX3N0cmluZ192aWV3KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHN0cikgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICA6IHB0cl8oc3RyLmRhdGEoKSksIGxlbl8oc3RyLmxlbmd0aCgpKSB7fQorCisvLyAjaWYgIWRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMpICYmICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX0RFTEVURURfRlVOQ1RJT05TKQorLy8gICAgICAgLy8gQ29uc3RydWN0aW5nIGEgc3RyaW5nX3ZpZXcgZnJvbSBhIHRlbXBvcmFyeSBzdHJpbmcgaXMgYSBiYWQgaWRlYQorLy8gICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yPgorLy8gICAgICAgICBiYXNpY19zdHJpbmdfdmlldyggICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiYpCisvLyAgICAgICAgICAgPSBkZWxldGU7CisvLyAjZW5kaWYKKworICAgICAgQk9PU1RfQ09OU1RFWFBSIGJhc2ljX3N0cmluZ192aWV3KGNvbnN0IGNoYXJUKiBzdHIpCisgICAgICAgIDogcHRyXyhzdHIpLCBsZW5fKHRyYWl0czo6bGVuZ3RoKHN0cikpIHt9CisKKyAgICAgIEJPT1NUX0NPTlNURVhQUiBiYXNpY19zdHJpbmdfdmlldyhjb25zdCBjaGFyVCogc3RyLCBzaXplX3R5cGUgbGVuKQorICAgICAgICA6IHB0cl8oc3RyKSwgbGVuXyhsZW4pIHt9CisKKyAgICAgICAgLy8gaXRlcmF0b3JzCisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9pdGVyYXRvciAgIGJlZ2luKCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeyByZXR1cm4gcHRyXzsgfQorICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfaXRlcmF0b3IgIGNiZWdpbigpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIHB0cl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGNvbnN0X2l0ZXJhdG9yICAgICBlbmQoKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7IHJldHVybiBwdHJfICsgbGVuXzsgfQorICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfaXRlcmF0b3IgICAgY2VuZCgpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIHB0cl8gKyBsZW5fOyB9CisgICAgICAgICAgICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgcmJlZ2luKCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICAgICAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgICAgcmVuZCgpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKyAgICAgICAgICAgICAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICAgY3JlbmQoKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAgICAgLy8gY2FwYWNpdHkKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBzaXplKCkgICAgIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBsZW5ndGgoKSAgIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIGxlbl87IH0KKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGJvb2wgZW1wdHkoKSAgICAgICAgIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgcmV0dXJuIGxlbl8gPT0gMDsgfQorCisgICAgICAgIC8vIGVsZW1lbnQgYWNjZXNzCisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7IHJldHVybiBwdHJfW3Bvc107IH0KKworICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdCBwb3MpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwb3MgPj0gbGVuXyA/IEJPT1NUX1RIUk9XX0VYQ0VQVElPTihzdGQ6Om91dF9vZl9yYW5nZSgiYm9vc3Q6OnN0cmluZ192aWV3OjphdCIpKSwgcHRyX1swXSA6IHB0cl9bcG9zXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gcHRyX1swXTsgfQorICAgICAgICBCT09TVF9DT05TVEVYUFIgY29uc3RfcmVmZXJlbmNlIGJhY2soKSAgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gcHRyX1tsZW5fLTFdOyB9CisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBjb25zdF9wb2ludGVyIGRhdGEoKSAgICBjb25zdCBCT09TVF9OT0VYQ0VQVCB7IHJldHVybiBwdHJfOyB9CisKKyAgICAgICAgLy8gbW9kaWZpZXJzCisgICAgICAgIHZvaWQgY2xlYXIoKSBCT09TVF9OT0VYQ0VQVCB7IGxlbl8gPSAwOyB9ICAgICAgICAgIC8vIEJvb3N0IGV4dGVuc2lvbgorCisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiB2b2lkIHJlbW92ZV9wcmVmaXgoc2l6ZV90eXBlIG4pIHsKKyAgICAgICAgICAgIGlmICggbiA+IGxlbl8gKQorICAgICAgICAgICAgICAgIG4gPSBsZW5fOworICAgICAgICAgICAgcHRyXyArPSBuOworICAgICAgICAgICAgbGVuXyAtPSBuOworICAgICAgICAgICAgfQorCisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiB2b2lkIHJlbW92ZV9zdWZmaXgoc2l6ZV90eXBlIG4pIHsKKyAgICAgICAgICAgIGlmICggbiA+IGxlbl8gKQorICAgICAgICAgICAgICAgIG4gPSBsZW5fOworICAgICAgICAgICAgbGVuXyAtPSBuOworICAgICAgICAgICAgfQorCisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiB2b2lkIHN3YXAoYmFzaWNfc3RyaW5nX3ZpZXcmIHMpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChwdHJfLCBzLnB0cl8pOworICAgICAgICAgICAgc3RkOjpzd2FwKGxlbl8sIHMubGVuXyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gYmFzaWNfc3RyaW5nX3ZpZXcgc3RyaW5nIG9wZXJhdGlvbnMKKyNpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfRVhQTElDSVRfQ09OVkVSU0lPTl9PUEVSQVRPUlMKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQWxsb2NhdG9yPgorICAgICAgICBleHBsaWNpdCBvcGVyYXRvciBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4oYmVnaW4oKSwgZW5kKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZm5kZWYgQk9PU1RfTk9fQ1hYMTFfRlVOQ1RJT05fVEVNUExBVEVfREVGQVVMVF9BUkdTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvciA9IHN0ZDo6YWxsb2NhdG9yPGNoYXJUPiA+CisgICAgICAgIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gdG9fc3RyaW5nKGNvbnN0IEFsbG9jYXRvciYgYSA9IEFsbG9jYXRvcigpKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPihiZWdpbigpLCBlbmQoKSwgYSk7CisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzPiB0b19zdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cz4oYmVnaW4oKSwgZW5kKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICAgICAgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiB0b19zdHJpbmcoY29uc3QgQWxsb2NhdG9yJiBhKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPihiZWdpbigpLCBlbmQoKSwgYSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBzaXplX3R5cGUgY29weShjaGFyVCogcywgc2l6ZV90eXBlIG4sIHNpemVfdHlwZSBwb3M9MCkgY29uc3QgeworICAgICAgICAgICAgaWYgKHBvcyA+IHNpemUoKSkKKyAgICAgICAgICAgICAgICBCT09TVF9USFJPV19FWENFUFRJT04oc3RkOjpvdXRfb2ZfcmFuZ2UoInN0cmluZ192aWV3Ojpjb3B5IiApKTsKKyAgICAgICAgICAgIHNpemVfdHlwZSBybGVuID0gKHN0ZDo6bWluKShuLCBsZW5fIC0gcG9zKTsKKyAgICAJCXRyYWl0c190eXBlOjpjb3B5KHMsIGRhdGEoKSArIHBvcywgcmxlbik7CisgICAgICAgICAgICByZXR1cm4gcmxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgYmFzaWNfc3RyaW5nX3ZpZXcgc3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuPW5wb3MpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmICggcG9zID4gc2l6ZSgpKQorICAgICAgICAgICAgICAgIEJPT1NUX1RIUk9XX0VYQ0VQVElPTiggc3RkOjpvdXRfb2ZfcmFuZ2UgKCAic3RyaW5nX3ZpZXc6OnN1YnN0ciIgKSApOworICAgICAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ192aWV3KGRhdGEoKSArIHBvcywgKHN0ZDo6bWluKShzaXplKCkgLSBwb3MsIG4pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgaW50IGNvbXBhcmUoYmFzaWNfc3RyaW5nX3ZpZXcgeCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgY29uc3QgaW50IGNtcCA9IHRyYWl0czo6Y29tcGFyZShwdHJfLCB4LnB0cl8sIChzdGQ6Om1pbikobGVuXywgeC5sZW5fKSk7CisgICAgICAgICAgICByZXR1cm4gY21wICE9IDAgPyBjbXAgOiAobGVuXyA9PSB4Lmxlbl8gPyAwIDogbGVuXyA8IHgubGVuXyA/IC0xIDogMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGJhc2ljX3N0cmluZ192aWV3IHgpCisgICAgICAgICAgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgcmV0dXJuIHN1YnN0cihwb3MxLCBuMSkuY29tcGFyZSh4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwKKyAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldyB4LCBzaXplX3R5cGUgcG9zMiwgc2l6ZV90eXBlIG4yKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3RyKHBvczEsIG4xKS5jb21wYXJlKHguc3Vic3RyKHBvczIsIG4yKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGludCBjb21wYXJlKGNvbnN0IGNoYXJUKiB4KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZShiYXNpY19zdHJpbmdfdmlldyh4KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGludCBjb21wYXJlKHNpemVfdHlwZSBwb3MxLCBzaXplX3R5cGUgbjEsIGNvbnN0IGNoYXJUKiB4KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3RyKHBvczEsIG4xKS5jb21wYXJlKGJhc2ljX3N0cmluZ192aWV3KHgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgaW50IGNvbXBhcmUoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlwZSBuMSwKKyAgICAgICAgICBjb25zdCBjaGFyVCogeCwgc2l6ZV90eXBlIG4yKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3RyKHBvczEsIG4xKS5jb21wYXJlKGJhc2ljX3N0cmluZ192aWV3KHgsIG4yKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gIFNlYXJjaGVzCisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBib29sIHN0YXJ0c193aXRoKGNoYXJUIGMpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsgICAgICAgICAgICAgIC8vIEJvb3N0IGV4dGVuc2lvbgorICAgICAgICAgICAgcmV0dXJuICFlbXB0eSgpICYmIHRyYWl0czo6ZXEoYywgZnJvbnQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfQ09OU1RFWFBSIGJvb2wgc3RhcnRzX3dpdGgoYmFzaWNfc3RyaW5nX3ZpZXcgeCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeyAgLy8gQm9vc3QgZXh0ZW5zaW9uCisgICAgICAgICAgICByZXR1cm4gbGVuXyA+PSB4Lmxlbl8gJiYgdHJhaXRzOjpjb21wYXJlKHB0cl8sIHgucHRyXywgeC5sZW5fKSA9PSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIEJPT1NUX0NPTlNURVhQUiBib29sIGVuZHNfd2l0aChjaGFyVCBjKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7ICAgICAgICAgICAgICAgIC8vIEJvb3N0IGV4dGVuc2lvbgorICAgICAgICAgICAgcmV0dXJuICFlbXB0eSgpICYmIHRyYWl0czo6ZXEoYywgYmFjaygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9DT05TVEVYUFIgYm9vbCBlbmRzX3dpdGgoYmFzaWNfc3RyaW5nX3ZpZXcgeCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeyAgICAvLyBCb29zdCBleHRlbnNpb24KKyAgICAgICAgICAgIHJldHVybiBsZW5fID49IHgubGVuXyAmJgorICAgICAgICAgICAgICAgdHJhaXRzOjpjb21wYXJlKHB0cl8gKyBsZW5fIC0geC5sZW5fLCB4LnB0cl8sIHgubGVuXykgPT0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyAgZmluZAorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIGZpbmQoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgICAgIGlmIChwb3MgPiBzaXplKCkpCisgICAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgaWYgKHMuZW1wdHkoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIGlmIChzLnNpemUoKSA+IHNpemUoKSAtIHBvcykKKyAgICAgICAgICAgICAgICByZXR1cm4gbnBvczsKKyAgICAgICAgICAgIGNvbnN0IGNoYXJUKiBjdXIgPSBwdHJfICsgcG9zOworICAgICAgICAgICAgY29uc3QgY2hhclQqIGxhc3QgPSBjZW5kKCkgLSBzLnNpemUoKSArIDE7CisgICAgICAgICAgICBmb3IgKDsgY3VyICE9IGxhc3QgOyArK2N1cikgeworICAgICAgICAgICAgICAgIGN1ciA9IHRyYWl0czo6ZmluZChjdXIsIGxhc3QgLSBjdXIsIHNbMF0pOworICAgICAgICAgICAgICAgIGlmICghY3VyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnBvczsKKyAgICAgICAgICAgICAgICBpZiAodHJhaXRzOjpjb21wYXJlKGN1ciwgcy5jYmVnaW4oKSwgcy5zaXplKCkpID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXIgLSBwdHJfOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5wb3M7CisgICAgICAgICAgICB9CisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBzaXplX3R5cGUgZmluZChjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgaWYgKHBvcyA+IHNpemUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIG5wb3M7CisgICAgICAgICAgICBjb25zdCBjaGFyVCogcmV0X3B0ciA9IHRyYWl0czo6ZmluZChwdHJfICsgcG9zLCBsZW5fIC0gcG9zLCBjKTsKKyAgICAgICAgICAgIGlmIChyZXRfcHRyKQorICAgICAgICAgICAgICByZXR1cm4gcmV0X3B0ciAtIHB0cl87CisgICAgICAgICAgICByZXR1cm4gbnBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmQoYmFzaWNfc3RyaW5nX3ZpZXcocywgbiksIHBvcyk7IH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmQoYmFzaWNfc3RyaW5nX3ZpZXcocyksIHBvcyk7IH0KKworICAgICAgICAvLyAgcmZpbmQKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSByZmluZChiYXNpY19zdHJpbmdfdmlldyBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgaWYgKGxlbl8gPCBzLmxlbl8pCisgICAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgaWYgKHBvcyA+IGxlbl8gLSBzLmxlbl8pCisgICAgICAgICAgICAgIHBvcyA9IGxlbl8gLSBzLmxlbl87CisgICAgICAgICAgICBpZiAocy5sZW5fID09IDB1KSAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIGlzIGFsd2F5cyBmb3VuZAorICAgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyVCogY3VyID0gcHRyXyArIHBvczsgOyAtLWN1cikgeworICAgICAgICAgICAgICAgIGlmICh0cmFpdHM6OmNvbXBhcmUoY3VyLCBzLnB0cl8sIHMubGVuXykgPT0gMCkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBjdXIgLSBwdHJfOworICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gcHRyXykKKyAgICAgICAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBzaXplX3R5cGUgcmZpbmQoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiByZmluZChiYXNpY19zdHJpbmdfdmlldygmYywgMSksIHBvcyk7IH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSByZmluZChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiByZmluZChiYXNpY19zdHJpbmdfdmlldyhzLCBuKSwgcG9zKTsgfQorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIHJmaW5kKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIHJmaW5kKGJhc2ljX3N0cmluZ192aWV3KHMpLCBwb3MpOyB9CisKKyAgICAgICAgLy8gIGZpbmRfZmlyc3Rfb2YKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mKGJhc2ljX3N0cmluZ192aWV3IHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBpZiAocG9zID49IGxlbl8gfHwgcy5sZW5fID09IDApCisgICAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgaXRlciA9IHN0ZDo6ZmluZF9maXJzdF9vZgorICAgICAgICAgICAgICAgICh0aGlzLT5jYmVnaW4gKCkgKyBwb3MsIHRoaXMtPmNlbmQgKCksIHMuY2JlZ2luICgpLCBzLmNlbmQgKCksIHRyYWl0czo6ZXEpOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIgPT0gdGhpcy0+Y2VuZCAoKSA/IG5wb3MgOiBzdGQ6OmRpc3RhbmNlICggdGhpcy0+Y2JlZ2luICgpLCBpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBzaXplX3R5cGUgZmluZF9maXJzdF9vZihjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmQoYywgcG9zKTsgfQorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCBCT09TVF9OT0VYQ0VQVAorICAgICAgICAgICAgeyByZXR1cm4gZmluZF9maXJzdF9vZihiYXNpY19zdHJpbmdfdmlldyhzLCBuKSwgcG9zKTsgfQorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCBCT09TVF9OT0VYQ0VQVAorICAgICAgICAgICAgeyByZXR1cm4gZmluZF9maXJzdF9vZihiYXNpY19zdHJpbmdfdmlldyhzKSwgcG9zKTsgfQorCisgICAgICAgIC8vICBmaW5kX2xhc3Rfb2YKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcgcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgICAgIGlmIChzLmxlbl8gPT0gMHUpCisgICAgICAgICAgICAgIHJldHVybiBucG9zOworICAgICAgICAgICAgaWYgKHBvcyA+PSBsZW5fKQorICAgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBwb3MgPSBsZW5fIC0gKHBvcysxKTsKKyAgICAgICAgICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXRlciA9IHN0ZDo6ZmluZF9maXJzdF9vZgorICAgICAgICAgICAgICAgICggdGhpcy0+Y3JiZWdpbiAoKSArIHBvcywgdGhpcy0+Y3JlbmQgKCksIHMuY2JlZ2luICgpLCBzLmNlbmQgKCksIHRyYWl0czo6ZXEgKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyID09IHRoaXMtPmNyZW5kICgpID8gbnBvcyA6IHJldmVyc2VfZGlzdGFuY2UgKCB0aGlzLT5jcmJlZ2luICgpLCBpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiBmaW5kX2xhc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcoJmMsIDEpLCBwb3MpOyB9CisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBzaXplX3R5cGUgZmluZF9sYXN0X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmRfbGFzdF9vZihiYXNpY19zdHJpbmdfdmlldyhzLCBuKSwgcG9zKTsgfQorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiBmaW5kX2xhc3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcocyksIHBvcyk7IH0KKworICAgICAgICAvLyAgZmluZF9maXJzdF9ub3Rfb2YKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihiYXNpY19zdHJpbmdfdmlldyBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgaWYgKHBvcyA+PSBsZW5fKQorICAgICAgICAgICAgICByZXR1cm4gbnBvczsKKyAgICAgICAgICAgIGlmIChzLmxlbl8gPT0gMCkKKyAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBmaW5kX25vdF9vZiAoIHRoaXMtPmNiZWdpbiAoKSArIHBvcywgdGhpcy0+Y2VuZCAoKSwgcyApOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIgPT0gdGhpcy0+Y2VuZCAoKSA/IG5wb3MgOiBzdGQ6OmRpc3RhbmNlICggdGhpcy0+Y2JlZ2luICgpLCBpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBzaXplX3R5cGUgZmluZF9maXJzdF9ub3Rfb2YoY2hhclQgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihiYXNpY19zdHJpbmdfdmlldygmYywgMSksIHBvcyk7IH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0IEJPT1NUX05PRVhDRVBUCisgICAgICAgICAgICB7IHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihiYXNpY19zdHJpbmdfdmlldyhzLCBuKSwgcG9zKTsgfQorICAgICAgICBCT09TVF9DWFgxNF9DT05TVEVYUFIgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmRfZmlyc3Rfbm90X29mKGJhc2ljX3N0cmluZ192aWV3KHMpLCBwb3MpOyB9CisKKyAgICAgICAgLy8gIGZpbmRfbGFzdF9ub3Rfb2YKKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGJhc2ljX3N0cmluZ192aWV3IHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgICAgICBpZiAocG9zID49IGxlbl8pCisgICAgICAgICAgICAgIHBvcyA9IGxlbl8gLSAxOworICAgICAgICAgICAgaWYgKHMubGVuXyA9PSAwdSkKKyAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgIHBvcyA9IGxlbl8gLSAocG9zKzEpOworICAgICAgICAgICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBpdGVyID0gZmluZF9ub3Rfb2YgKCB0aGlzLT5jcmJlZ2luICgpICsgcG9zLCB0aGlzLT5jcmVuZCAoKSwgcyApOworICAgICAgICAgICAgcmV0dXJuIGl0ZXIgPT0gdGhpcy0+Y3JlbmQgKCkgPyBucG9zIDogcmV2ZXJzZV9kaXN0YW5jZSAoIHRoaXMtPmNyYmVnaW4gKCksIGl0ZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNoYXJUIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCBCT09TVF9OT0VYQ0VQVAorICAgICAgICAgICAgeyByZXR1cm4gZmluZF9sYXN0X25vdF9vZihiYXNpY19zdHJpbmdfdmlldygmYywgMSksIHBvcyk7IH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcocywgbiksIHBvcyk7IH0KKyAgICAgICAgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIHNpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QgQk9PU1RfTk9FWENFUFQKKyAgICAgICAgICAgIHsgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2YoYmFzaWNfc3RyaW5nX3ZpZXcocyksIHBvcyk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSByX2l0ZXI+CisgICAgICAgIHNpemVfdHlwZSByZXZlcnNlX2Rpc3RhbmNlKHJfaXRlciBmaXJzdCwgcl9pdGVyIGxhc3QpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgLy8gUG9ydGFiaWxpdHkgbm90ZSBoZXJlOiBzdGQ6OmRpc3RhbmNlIGlzIG5vdCBOT0VYQ0VQVCwgYnV0IGNhbGxpbmcgaXQgd2l0aCBhIHN0cmluZ192aWV3OjpyZXZlcnNlX2l0ZXJhdG9yIHdpbGwgbm90IHRocm93LgorICAgICAgICAgICAgcmV0dXJuIGxlbl8gLSAxIC0gc3RkOjpkaXN0YW5jZSAoIGZpcnN0LCBsYXN0ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgorICAgICAgICBJdGVyYXRvciBmaW5kX25vdF9vZihJdGVyYXRvciBmaXJzdCwgSXRlcmF0b3IgbGFzdCwgYmFzaWNfc3RyaW5nX3ZpZXcgcykgY29uc3QgQk9PU1RfTk9FWENFUFQgeworICAgICAgICAgICAgZm9yICg7IGZpcnN0ICE9IGxhc3QgOyArK2ZpcnN0KQorICAgICAgICAgICAgICAgIGlmICggMCA9PSB0cmFpdHM6OmZpbmQocy5wdHJfLCBzLmxlbl8sICpmaXJzdCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICAgICAgICAgIHJldHVybiBsYXN0OworICAgICAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXJUICpwdHJfOworICAgICAgICBzdGQ6OnNpemVfdCBsZW5fOworICAgICAgICB9OworCisKKy8vICBDb21wYXJpc29uIG9wZXJhdG9ycworLy8gIEVxdWFsaXR5CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICBpZiAoeC5zaXplICgpICE9IHkuc2l6ZSAoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4geC5jb21wYXJlKHkpID09IDA7CisgICAgICAgIH0KKworLy8gIEluZXF1YWxpdHkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvciE9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIGlmICggeC5zaXplICgpICE9IHkuc2l6ZSAoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB4LmNvbXBhcmUoeSkgIT0gMDsKKyAgICAgICAgfQorCisvLyAgTGVzcyB0aGFuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I8KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHguY29tcGFyZSh5KSA8IDA7CisgICAgICAgIH0KKworLy8gIEdyZWF0ZXIgdGhhbgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yPihiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4LmNvbXBhcmUoeSkgPiAwOworICAgICAgICB9CisKKy8vICBMZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjw9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4LmNvbXBhcmUoeSkgPD0gMDsKKyAgICAgICAgfQorCisvLyAgR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+PShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4geC5jb21wYXJlKHkpID49IDA7CisgICAgICAgIH0KKworLy8gInN1ZmZpY2llbnQgYWRkaXRpb25hbCBvdmVybG9hZHMgb2YgY29tcGFyaXNvbiBmdW5jdGlvbnMiCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj09KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4geCA9PSBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeCkgPT0geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I9PShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJUICogeSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4geCA9PSBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyVCAqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih4KSA9PSB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4ICE9IGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih4KSAhPSB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvciE9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyVCAqIHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHggIT0gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hhclQgKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeCkgIT0geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjwoYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHggPCBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjwoY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHgpIDwgeTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I8KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJUICogeSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4geCA8IGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjwoY29uc3QgY2hhclQgKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih4KSA8IHk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4ID4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih4KSA+IHk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yPihiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyVCAqIHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHggPiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGNoYXJUICogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeCkgPiB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yPD0oYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4IDw9IGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzLCB0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yPD0oY29uc3Qgc3RkOjpiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiAmIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih4KSA8PSB5OworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcjw9KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyVCAqIHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIHggPD0gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeSk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHM+CisgICAgaW5saW5lIEJPT1NUX0NYWDE0X0NPTlNURVhQUiBib29sIG9wZXJhdG9yPD0oY29uc3QgY2hhclQgKiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeCkgPD0geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj49KGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ICYgeSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4geCA+PSBiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPih5KTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cywgdHlwZW5hbWUgQWxsb2NhdG9yPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gJiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4geSkgQk9PU1RfTk9FWENFUFQgeworICAgICAgICByZXR1cm4gYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsIHRyYWl0cz4oeCkgPj0geTsKKyAgICAgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cz4KKyAgICBpbmxpbmUgQk9PU1RfQ1hYMTRfQ09OU1RFWFBSIGJvb2wgb3BlcmF0b3I+PShiYXNpY19zdHJpbmdfdmlldzxjaGFyVCwgdHJhaXRzPiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhclQgKiB5KSBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiB4ID49IGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHkpOworICAgICAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzPgorICAgIGlubGluZSBCT09TVF9DWFgxNF9DT05TVEVYUFIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGNoYXJUICogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+IHkpIEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIGJhc2ljX3N0cmluZ192aWV3PGNoYXJULCB0cmFpdHM+KHgpID49IHk7CisgICAgICAgIH0KKworICAgIG5hbWVzcGFjZSBkZXRhaWwgeworCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgICAgIGlubGluZSB2b2lkIHN2X2luc2VydF9maWxsX2NoYXJzKHN0ZDo6YmFzaWNfb3N0cmVhbTxjaGFyVCwgdHJhaXRzPiYgb3MsIHN0ZDo6c2l6ZV90IG4pIHsKKyAgICAgICAgICAgIGVudW0geyBjaHVua19zaXplID0gOCB9OworICAgICAgICAgICAgY2hhclQgZmlsbF9jaGFyc1tjaHVua19zaXplXTsKKyAgICAgICAgICAgIHN0ZDo6ZmlsbF9uKGZpbGxfY2hhcnMsIHN0YXRpY19jYXN0PCBzdGQ6OnNpemVfdCA+KGNodW5rX3NpemUpLCBvcy5maWxsKCkpOworICAgICAgICAgICAgZm9yICg7IG4gPj0gY2h1bmtfc2l6ZSAmJiBvcy5nb29kKCk7IG4gLT0gY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICBvcy53cml0ZShmaWxsX2NoYXJzLCBzdGF0aWNfY2FzdDwgc3RkOjpzaXplX3QgPihjaHVua19zaXplKSk7CisgICAgICAgICAgICBpZiAobiA+IDAgJiYgb3MuZ29vZCgpKQorICAgICAgICAgICAgICAgIG9zLndyaXRlKGZpbGxfY2hhcnMsIG4pOworICAgICAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHM+CisgICAgICAgIHZvaWQgc3ZfaW5zZXJ0X2FsaWduZWQoc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywgY29uc3QgYmFzaWNfc3RyaW5nX3ZpZXc8Y2hhclQsdHJhaXRzPiYgc3RyKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplID0gc3RyLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IGFsaWdubWVudF9zaXplID0gc3RhdGljX2Nhc3Q8IHN0ZDo6c2l6ZV90ID4ob3Mud2lkdGgoKSkgLSBzaXplOworICAgICAgICAgICAgY29uc3QgYm9vbCBhbGlnbl9sZWZ0ID0gKG9zLmZsYWdzKCkgJiBzdGQ6OmJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz46OmFkanVzdGZpZWxkKSA9PSBzdGQ6OmJhc2ljX29zdHJlYW08Y2hhclQsIHRyYWl0cz46OmxlZnQ7CisgICAgICAgICAgICBpZiAoIWFsaWduX2xlZnQpIHsKKyAgICAgICAgICAgICAgICBkZXRhaWw6OnN2X2luc2VydF9maWxsX2NoYXJzKG9zLCBhbGlnbm1lbnRfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG9zLmdvb2QoKSkKKyAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUoc3RyLmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgb3Mud3JpdGUoc3RyLmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG9zLmdvb2QoKSkKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpzdl9pbnNlcnRfZmlsbF9jaGFycyhvcywgYWxpZ25tZW50X3NpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworICAgIC8vIEluc2VydGVyCisgICAgdGVtcGxhdGU8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cz4KKyAgICBpbmxpbmUgc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JgorICAgIG9wZXJhdG9yPDwoc3RkOjpiYXNpY19vc3RyZWFtPGNoYXJULCB0cmFpdHM+JiBvcywKKyAgICAgIGNvbnN0IGJhc2ljX3N0cmluZ192aWV3PGNoYXJULHRyYWl0cz4mIHN0cikgeworICAgICAgICBpZiAob3MuZ29vZCgpKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNpemVfdCBzaXplID0gc3RyLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IHcgPSBzdGF0aWNfY2FzdDwgc3RkOjpzaXplX3QgPihvcy53aWR0aCgpKTsKKyAgICAgICAgICAgIGlmICh3IDw9IHNpemUpCisgICAgICAgICAgICAgICAgb3Mud3JpdGUoc3RyLmRhdGEoKSwgc2l6ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGV0YWlsOjpzdl9pbnNlcnRfYWxpZ25lZChvcywgc3RyKTsKKyAgICAgICAgICAgIG9zLndpZHRoKDApOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAvLyBudW1lcmljIGNvbnZlcnNpb25zCisgICAgLy8KKyAgICAvLyAgVGhlc2UgYXJlIHNob3J0LXRlcm0gaW1wbGVtZW50YXRpb25zLgorICAgIC8vICBJbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIEkgd291bGQgcmF0aGVyIGF2b2lkIHRoZSBjb3B5aW5nLgorICAgIC8vCisgICAgaW5saW5lIGludCBzdG9pIChzdHJpbmdfdmlldyBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2kgKCBzdGQ6OnN0cmluZyhzdHIpLCBpZHgsIGJhc2UgKTsKKyAgICAgICAgfQorCisgICAgaW5saW5lIGxvbmcgc3RvbCAoc3RyaW5nX3ZpZXcgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9sICggc3RkOjpzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSB1bnNpZ25lZCBsb25nIHN0b3VsIChzdHJpbmdfdmlldyBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b3VsICggc3RkOjpzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGxvbmcgc3RvbGwgKHN0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvbGwgKCBzdGQ6OnN0cmluZyhzdHIpLCBpZHgsIGJhc2UgKTsKKyAgICAgICAgfQorCisgICAgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBzdG91bGwgKHN0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvdWxsICggc3RkOjpzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBmbG9hdCBzdG9mIChzdHJpbmdfdmlldyBzdHIsIHNpemVfdCogaWR4PTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvZiAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgZG91YmxlIHN0b2QgKHN0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9kICggc3RkOjpzdHJpbmcoc3RyKSwgaWR4ICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGRvdWJsZSBzdG9sZCAoc3RyaW5nX3ZpZXcgc3RyLCBzaXplX3QqIGlkeD0wKSAgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9sZCAoIHN0ZDo6c3RyaW5nKHN0ciksIGlkeCApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgaW50ICBzdG9pICh3c3RyaW5nX3ZpZXcgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9pICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgbG9uZyBzdG9sICh3c3RyaW5nX3ZpZXcgc3RyLCBzaXplX3QqIGlkeD0wLCBpbnQgYmFzZT0xMCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9sICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBzdG91bCAod3N0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvdWwgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4LCBiYXNlICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGxvbmcgc3RvbGwgKHdzdHJpbmdfdmlldyBzdHIsIHNpemVfdCogaWR4PTAsIGludCBiYXNlPTEwKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2xsICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIHN0b3VsbCAod3N0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCwgaW50IGJhc2U9MTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvdWxsICggc3RkOjp3c3RyaW5nKHN0ciksIGlkeCwgYmFzZSApOworICAgICAgICB9CisKKyAgICBpbmxpbmUgZmxvYXQgIHN0b2YgKHdzdHJpbmdfdmlldyBzdHIsIHNpemVfdCogaWR4PTApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvZiAoIHN0ZDo6d3N0cmluZyhzdHIpLCBpZHggKTsKKyAgICAgICAgfQorCisgICAgaW5saW5lIGRvdWJsZSBzdG9kICh3c3RyaW5nX3ZpZXcgc3RyLCBzaXplX3QqIGlkeD0wKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0b2QgKCBzdGQ6OndzdHJpbmcoc3RyKSwgaWR4ICk7CisgICAgICAgIH0KKworICAgIGlubGluZSBsb25nIGRvdWJsZSBzdG9sZCAod3N0cmluZ192aWV3IHN0ciwgc2l6ZV90KiBpZHg9MCkgeworICAgICAgICByZXR1cm4gc3RkOjpzdG9sZCAoIHN0ZDo6d3N0cmluZyhzdHIpLCBpZHggKTsKKyAgICAgICAgfQorI2VuZGlmCisKK30KKworI2lmIDAKK25hbWVzcGFjZSBzdGQgeworICAgIC8vIEhhc2hpbmcKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPGJvb3N0OjpzdHJpbmdfdmlldz47CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxib29zdDo6dTE2c3RyaW5nX3ZpZXc+OworICAgIHRlbXBsYXRlPD4gc3RydWN0IGhhc2g8Ym9vc3Q6OnUzMnN0cmluZ192aWV3PjsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPGJvb3N0Ojp3c3RyaW5nX3ZpZXc+OworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L3N0cmluZ192aWV3X2Z3ZC5ocHAgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvc3RyaW5nX3ZpZXdfZndkLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRhMGRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3N0cmluZ192aWV3X2Z3ZC5ocHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAgIENvcHlyaWdodCAoYykgTWFyc2hhbGwgQ2xvdyAyMDEyLTIwMTIuCisKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworCisgICAgQmFzZWQgb24gdGhlIFN0cmluZ1JlZiBpbXBsZW1lbnRhdGlvbiBpbiBMTFZNIChodHRwOi8vbGx2bS5vcmcpIGFuZAorICAgIE4zNDIyIGJ5IEplZmZyZXkgWWFzc2tpbgorICAgICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDEyL24zNDQyLmh0bWwKKyAgICBVcGRhdGVkIEp1bHkgMjAxNSB0byByZWZsZWN0IHRoZSBMaWJyYXJ5IEZ1bmRhbWVudGFscyBUUworICAgICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDE1L240NDgwLmh0bWwKKworKi8KKworI2lmbmRlZiBCT09TVF9TVFJJTkdfVklFV19GV0RfSFBQCisjZGVmaW5lIEJPT1NUX1NUUklOR19WSUVXX0ZXRF9IUFAKKworI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYm9vc3QgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8Y2hhclQ+ID4gY2xhc3MgYmFzaWNfc3RyaW5nX3ZpZXc7CisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdfdmlldzxjaGFyLCAgICAgc3RkOjpjaGFyX3RyYWl0czxjaGFyPiA+ICAgICAgICBzdHJpbmdfdmlldzsKKyAgICB0eXBlZGVmIGJhc2ljX3N0cmluZ192aWV3PHdjaGFyX3QsICBzdGQ6OmNoYXJfdHJhaXRzPHdjaGFyX3Q+ID4gICAgd3N0cmluZ192aWV3OworCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX0NIQVIxNl9UCisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdfdmlldzxjaGFyMTZfdCwgc3RkOjpjaGFyX3RyYWl0czxjaGFyMTZfdD4gPiB1MTZzdHJpbmdfdmlldzsKKyNlbmRpZgorCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX0NIQVIzMl9UCisgICAgdHlwZWRlZiBiYXNpY19zdHJpbmdfdmlldzxjaGFyMzJfdCwgc3RkOjpjaGFyX3RyYWl0czxjaGFyMzJfdD4gPiB1MzJzdHJpbmdfdmlldzsKKyNlbmRpZgorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L3R5cGVkX2luX3BsYWNlX2ZhY3RvcnkuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3R5cGVkX2luX3BsYWNlX2ZhY3RvcnkuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2EzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvdHlwZWRfaW5fcGxhY2VfZmFjdG9yeS5ocHAKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDAzLCBGZXJuYW5kbyBMdWlzIENhY2Npb2xhIENhcmJhbGxhbC4KKy8vIENvcHlyaWdodCAoQykgMjAwNywgVG9iaWFzIFNjaHdpbmdlci4KKy8vCisvLyBVc2UsIG1vZGlmaWNhdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZQorLy8gTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBTZWUgaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9vcHRpb25hbCBmb3IgZG9jdW1lbnRhdGlvbi4KKy8vCisvLyBZb3UgYXJlIHdlbGNvbWUgdG8gY29udGFjdCB0aGUgYXV0aG9yIGF0OgorLy8gIGZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tCisvLworI2lmbmRlZiBCT09TVF9VVElMSVRZX1RZUEVEX0lOUExBQ0VfRkFDVE9SWV8wNEFQUjIwMDdfSFBQCisjaWZuZGVmIEJPT1NUX1BQX0lTX0lURVJBVElORworCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9kZXRhaWwvaW5fcGxhY2VfZmFjdG9yeV9wcmVmaXguaHBwPgorCituYW1lc3BhY2UgYm9vc3QgeworCitjbGFzcyB0eXBlZF9pbl9wbGFjZV9mYWN0b3J5X2Jhc2Uge30gOworCisjZGVmaW5lICBCT09TVF9QUF9JVEVSQVRJT05fTElNSVRTICgwLCBCT09TVF9NQVhfSU5QTEFDRV9GQUNUT1JZX0FSSVRZKQorI2RlZmluZSAgQk9PU1RfUFBfRklMRU5BTUVfMSA8Ym9vc3QvdXRpbGl0eS90eXBlZF9pbl9wbGFjZV9mYWN0b3J5LmhwcD4KKyNpbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQorCit9IC8vIG5hbWVzcGFjZSBib29zdAorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9kZXRhaWwvaW5fcGxhY2VfZmFjdG9yeV9zdWZmaXguaHBwPgorCisjZGVmaW5lIEJPT1NUX1VUSUxJVFlfVFlQRURfSU5QTEFDRV9GQUNUT1JZXzA0QVBSMjAwN19IUFAKKyNlbHNlIAorI2RlZmluZSBOIEJPT1NUX1BQX0lURVJBVElPTigpCisKK3RlbXBsYXRlPCBjbGFzcyBUIEJPT1NUX1BQX0VOVU1fVFJBSUxJTkdfUEFSQU1TKE4sY2xhc3MgQSkgPgorY2xhc3MgQk9PU1RfUFBfQ0FUKHR5cGVkX2luX3BsYWNlX2ZhY3RvcnksTikgCisgIDogCisgIHB1YmxpYyB0eXBlZF9pbl9wbGFjZV9mYWN0b3J5X2Jhc2UKK3sKK3B1YmxpYzoKKworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKworICBleHBsaWNpdCBCT09TVF9QUF9DQVQodHlwZWRfaW5fcGxhY2VfZmFjdG9yeSxOKSAKKyAgICAgICggQk9PU1RfUFBfRU5VTV9CSU5BUllfUEFSQU1TKE4sIEEsIGNvbnN0JiBhKSApCisjaWYgTiA+IDAKKyAgICA6IEJPT1NUX1BQX0VOVU0oTiwgQk9PU1RfREVGSU5FX0lOUExBQ0VfRkFDVE9SWV9DTEFTU19NRU1CRVJfSU5JVCwgXykKKyNlbmRpZgorICB7fQorCisgIHZvaWQqIGFwcGx5ICh2b2lkKiBhZGRyZXNzKSBjb25zdAorICB7CisgICAgcmV0dXJuIG5ldyhhZGRyZXNzKSBUKCBCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBtX2EpICk7CisgIH0KKworICB2b2lkKiBhcHBseSAodm9pZCogYWRkcmVzcywgc3RkOjpzaXplX3QgbikgY29uc3QKKyAgeworICAgIGZvcih2b2lkKiBuZXh0ID0gYWRkcmVzcyA9IHRoaXMtPmFwcGx5KGFkZHJlc3MpOyAhISAtLW47KQorICAgICAgdGhpcy0+YXBwbHkobmV4dCA9IHN0YXRpY19jYXN0PGNoYXIgKj4obmV4dCkgKyBzaXplb2YoVCkpOworICAgIHJldHVybiBhZGRyZXNzOyAKKyAgfQorCisgIEJPT1NUX1BQX1JFUEVBVChOLCBCT09TVF9ERUZJTkVfSU5QTEFDRV9GQUNUT1JZX0NMQVNTX01FTUJFUl9ERUNMLCBfKQorfTsKKwordGVtcGxhdGU8IGNsYXNzIFQgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoTiwgY2xhc3MgQSkgPgoraW5saW5lIEJPT1NUX1BQX0NBVCh0eXBlZF9pbl9wbGFjZV9mYWN0b3J5LE4pPAorICAgIFQgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoTiwgQSkgPgoraW5fcGxhY2UoIEJPT1NUX1BQX0VOVU1fQklOQVJZX1BBUkFNUyhOLCBBLCBjb25zdCYgYSkgKQoreworICByZXR1cm4gQk9PU1RfUFBfQ0FUKHR5cGVkX2luX3BsYWNlX2ZhY3RvcnksTik8IAorICAgICAgVCBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhOLCBBKSA+KCBCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBhKSApOworfQorCisjdW5kZWYgTgorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ib29zdC91dGlsaXR5L3ZhbHVlX2luaXQuaHBwIGIvaW5jbHVkZS9ib29zdC91dGlsaXR5L3ZhbHVlX2luaXQuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOGRlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Jvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAKQEAgLTAsMCArMSwyODEgQEAKKy8vIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA4LCBGZXJuYW5kbyBMdWlzIENhY2Npb2xhIENhcmJhbGxhbC4KKy8vCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLworLy8gMjEgQWdvIDIwMDIgKENyZWF0ZWQpIEZlcm5hbmRvIENhY2Npb2xhCisvLyAyNCBEZWMgMjAwNyAoUmVmYWN0b3JlZCBhbmQgd29ya2VkIGFyb3VuZCB2YXJpb3VzIGNvbXBpbGVyIGJ1Z3MpIEZlcm5hbmRvIENhY2Npb2xhLCBOaWVscyBEZWtrZXIKKy8vIDIzIE1heSAyMDA4IChGaXhlZCBvcGVyYXRvcj0gY29uc3QgaXNzdWUsIGFkZGVkIGluaXRpYWxpemVkX3ZhbHVlKSBOaWVscyBEZWtrZXIsIEZlcm5hbmRvIENhY2Npb2xhCisvLyAyMSBBZ28gMjAwOCAoQWRkZWQgc3dhcCkgTmllbHMgRGVra2VyLCBGZXJuYW5kbyBDYWNjaW9sYQorLy8gMjAgRmViIDIwMDkgKEZpeGVkIGxvZ2ljYWwgY29uc3QtbmVzcyBpc3N1ZXMpIE5pZWxzIERla2tlciwgRmVybmFuZG8gQ2FjY2lvbGEKKy8vIDAzIEFwciAyMDEwIChBZGRlZCBpbml0aWFsaXplZDxUPiwgc3VnZ2VzdGVkIGJ5IEplZmZyZXkgSGVsbHJ1bmcsIGZpeGluZyAjMzQ3MikgTmllbHMgRGVra2VyCisvLyAzMCBNYXkgMjAxMCAoTWFkZSBtZW1zZXQgY2FsbCBjb25kaXRpb25hbCwgZml4aW5nICMzODY5KSBOaWVscyBEZWtrZXIKKy8vCisjaWZuZGVmIEJPT1NUX1VUSUxJVFlfVkFMVUVfSU5JVF8yMUFHTzIwMDJfSFBQCisjZGVmaW5lIEJPT1NUX1VUSUxJVFlfVkFMVUVfSU5JVF8yMUFHTzIwMDJfSFBQCisKKy8vIE5vdGU6IFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQgaGFkIHRvIGRlYWwgd2l0aCB0aGUKKy8vIGZhY3QgdGhhdCB2YXJpb3VzIGNvbXBpbGVycyBoYXZlbid0IGZ1bGx5IGltcGxlbWVudGVkIHZhbHVlLWluaXRpYWxpemF0aW9uLgorLy8gVGhlIGNvbnN0cnVjdG9yIG9mIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiB3b3JrcyBhcm91bmQgdGhlc2UgY29tcGlsZXIKKy8vIGlzc3VlcywgYnkgY2xlYXJpbmcgdGhlIGJ5dGVzIG9mIFQsIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIFQgb2JqZWN0IGl0CisvLyBjb250YWlucy4gTW9yZSBkZXRhaWxzIG9uIHRoZXNlIGlzc3VlcyBhcmUgYXQgbGlicy91dGlsaXR5L3ZhbHVlX2luaXQuaHRtCisKKyNpbmNsdWRlIDxib29zdC9hbGlnbmVkX3N0b3JhZ2UuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+IC8vIEZvciBCT09TVF9OT19DT01QTEVURV9WQUxVRV9JTklUSUFMSVpBVElPTi4KKyNpbmNsdWRlIDxib29zdC9kZXRhaWwvd29ya2Fyb3VuZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvY3ZfdHJhaXRzLmhwcD4KKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9hbGlnbm1lbnRfb2YuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3N3YXAuaHBwPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bmV3PgorCisjaWZkZWYgQk9PU1RfTVNWQworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisvLyBJdCBpcyBzYWZlIHRvIGlnbm9yZSB0aGUgZm9sbG93aW5nIHdhcm5pbmcgZnJvbSBNU1ZDIDcuMSBvciBoaWdoZXI6CisvLyAid2FybmluZyBDNDM1MTogbmV3IGJlaGF2aW9yOiBlbGVtZW50cyBvZiBhcnJheSB3aWxsIGJlIGRlZmF1bHQgaW5pdGlhbGl6ZWQiCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDM1MSkKKy8vIEl0IGlzIHNhZmUgdG8gaWdub3JlIHRoZSBmb2xsb3dpbmcgTVNWQyB3YXJuaW5nLCB3aGljaCBtYXkgcG9wIHVwIHdoZW4gVCBpcyAKKy8vIGEgY29uc3QgdHlwZTogIndhcm5pbmcgQzQ1MTI6IGFzc2lnbm1lbnQgb3BlcmF0b3IgY291bGQgbm90IGJlIGdlbmVyYXRlZCIuCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDUxMikKKyNlbmRpZgorCisjaWZkZWYgQk9PU1RfTk9fQ09NUExFVEVfVkFMVUVfSU5JVElBTElaQVRJT04KKyAgLy8gSW1wbGVtZW50YXRpb24gZGV0YWlsOiBUaGUgbWFjcm8gQk9PU1RfREVUQUlMX1ZBTFVFX0lOSVRfV09SS0FST1VORF9TVUdHRVNURUQgCisgIC8vIHN1Z2dlc3RzIHRoYXQgYSB3b3JrYXJvdW5kIHNob3VsZCBiZSBhcHBsaWVkLCBiZWNhdXNlIG9mIGNvbXBpbGVyIGlzc3VlcyAKKyAgLy8gcmVnYXJkaW5nIHZhbHVlLWluaXRpYWxpemF0aW9uLgorICAjZGVmaW5lIEJPT1NUX0RFVEFJTF9WQUxVRV9JTklUX1dPUktBUk9VTkRfU1VHR0VTVEVECisjZW5kaWYKKworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlsOiBUaGUgbWFjcm8gQk9PU1RfREVUQUlMX1ZBTFVFX0lOSVRfV09SS0FST1VORAorLy8gc3dpdGNoZXMgdGhlIHZhbHVlLWluaXRpYWxpemF0aW9uIHdvcmthcm91bmQgZWl0aGVyIG9uIG9yIG9mZi4KKyNpZm5kZWYgQk9PU1RfREVUQUlMX1ZBTFVFX0lOSVRfV09SS0FST1VORAorICAjaWZkZWYgQk9PU1RfREVUQUlMX1ZBTFVFX0lOSVRfV09SS0FST1VORF9TVUdHRVNURUQKKyAgI2RlZmluZSBCT09TVF9ERVRBSUxfVkFMVUVfSU5JVF9XT1JLQVJPVU5EIDEKKyAgI2Vsc2UKKyAgI2RlZmluZSBCT09TVF9ERVRBSUxfVkFMVUVfSU5JVF9XT1JLQVJPVU5EIDAKKyAgI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIGJvb3N0IHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NsYXNzIGluaXRpYWxpemVkCit7CisgIHByaXZhdGUgOgorICAgIHN0cnVjdCB3cmFwcGVyCisgICAgeworI2lmICFCT09TVF9XT1JLQVJPVU5EKF9fQk9STEFORENfXywgQk9PU1RfVEVTVEVEX0FUKDB4NTkyKSkKKyAgICAgIHR5cGVuYW1lCisjZW5kaWYgCisgICAgICByZW1vdmVfY29uc3Q8VD46OnR5cGUgZGF0YTsKKworICAgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICAgIHdyYXBwZXIoKQorICAgICAgOgorICAgICAgZGF0YSgpCisgICAgICB7CisgICAgICB9CisKKyAgICAgIEJPT1NUX0dQVV9FTkFCTEVECisgICAgICB3cmFwcGVyKFQgY29uc3QgJiBhcmcpCisgICAgICA6CisgICAgICBkYXRhKGFyZykKKyAgICAgIHsKKyAgICAgIH0KKyAgICB9OworCisgICAgbXV0YWJsZQorI2lmICFCT09TVF9XT1JLQVJPVU5EKF9fQk9STEFORENfXywgQk9PU1RfVEVTVEVEX0FUKDB4NTkyKSkKKyAgICAgIHR5cGVuYW1lCisjZW5kaWYgCisgICAgICBhbGlnbmVkX3N0b3JhZ2U8c2l6ZW9mKHdyYXBwZXIpLCBhbGlnbm1lbnRfb2Y8d3JhcHBlcj46OnZhbHVlPjo6dHlwZSB4OworCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICB3cmFwcGVyICogd3JhcHBlcl9hZGRyZXNzKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8d3JhcHBlciAqPiggc3RhdGljX2Nhc3Q8dm9pZCo+KCZ4KSk7CisgICAgfQorCisgIHB1YmxpYyA6CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIGluaXRpYWxpemVkKCkKKyAgICB7CisjaWYgQk9PU1RfREVUQUlMX1ZBTFVFX0lOSVRfV09SS0FST1VORAorICAgICAgc3RkOjptZW1zZXQoJngsIDAsIHNpemVvZih4KSk7CisjZW5kaWYKKyAgICAgIG5ldyAod3JhcHBlcl9hZGRyZXNzKCkpIHdyYXBwZXIoKTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIGluaXRpYWxpemVkKGluaXRpYWxpemVkIGNvbnN0ICYgYXJnKQorICAgIHsKKyAgICAgIG5ldyAod3JhcHBlcl9hZGRyZXNzKCkpIHdyYXBwZXIoIHN0YXRpY19jYXN0PHdyYXBwZXIgY29uc3QgJj4oKihhcmcud3JhcHBlcl9hZGRyZXNzKCkpKSk7CisgICAgfQorCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICBleHBsaWNpdCBpbml0aWFsaXplZChUIGNvbnN0ICYgYXJnKQorICAgIHsKKyAgICAgIG5ldyAod3JhcHBlcl9hZGRyZXNzKCkpIHdyYXBwZXIoYXJnKTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIGluaXRpYWxpemVkICYgb3BlcmF0b3I9KGluaXRpYWxpemVkIGNvbnN0ICYgYXJnKQorICAgIHsKKyAgICAgIC8vIEFzc2lnbm1lbnQgaXMgb25seSBhbGxvd2VkIHdoZW4gVCBpcyBub24tY29uc3QuCisgICAgICBCT09TVF9TVEFUSUNfQVNTRVJUKCAhIGlzX2NvbnN0PFQ+Ojp2YWx1ZSApOworICAgICAgKndyYXBwZXJfYWRkcmVzcygpID0gc3RhdGljX2Nhc3Q8d3JhcHBlciBjb25zdCAmPigqKGFyZy53cmFwcGVyX2FkZHJlc3MoKSkpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEJPT1NUX0dQVV9FTkFCTEVECisgICAgfmluaXRpYWxpemVkKCkKKyAgICB7CisgICAgICB3cmFwcGVyX2FkZHJlc3MoKS0+d3JhcHBlcjo6fndyYXBwZXIoKTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIFQgY29uc3QgJiBkYXRhKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gd3JhcHBlcl9hZGRyZXNzKCktPmRhdGE7CisgICAgfQorCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICBUJiBkYXRhKCkKKyAgICB7CisgICAgICByZXR1cm4gd3JhcHBlcl9hZGRyZXNzKCktPmRhdGE7CisgICAgfQorCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICB2b2lkIHN3YXAoaW5pdGlhbGl6ZWQgJiBhcmcpCisgICAgeworICAgICAgOjpib29zdDo6c3dhcCggdGhpcy0+ZGF0YSgpLCBhcmcuZGF0YSgpICk7CisgICAgfQorCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICBvcGVyYXRvciBUIGNvbnN0ICYoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiB3cmFwcGVyX2FkZHJlc3MoKS0+ZGF0YTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIG9wZXJhdG9yIFQmKCkKKyAgICB7CisgICAgICByZXR1cm4gd3JhcHBlcl9hZGRyZXNzKCktPmRhdGE7CisgICAgfQorCit9IDsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK0JPT1NUX0dQVV9FTkFCTEVECitUIGNvbnN0JiBnZXQgKCBpbml0aWFsaXplZDxUPiBjb25zdCYgeCApCit7CisgIHJldHVybiB4LmRhdGEoKSA7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitCT09TVF9HUFVfRU5BQkxFRAorVCYgZ2V0ICggaW5pdGlhbGl6ZWQ8VD4mIHggKQoreworICByZXR1cm4geC5kYXRhKCkgOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorQk9PU1RfR1BVX0VOQUJMRUQKK3ZvaWQgc3dhcCAoIGluaXRpYWxpemVkPFQ+ICYgbGhzLCBpbml0aWFsaXplZDxUPiAmIHJocyApCit7CisgIGxocy5zd2FwKHJocykgOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgdmFsdWVfaW5pdGlhbGl6ZWQKK3sKKyAgcHJpdmF0ZSA6CisKKyAgICAvLyBpbml0aWFsaXplZDxUPiBkb2VzIHZhbHVlLWluaXRpYWxpemF0aW9uIGJ5IGRlZmF1bHQuCisgICAgaW5pdGlhbGl6ZWQ8VD4gbV9kYXRhOworCisgIHB1YmxpYyA6CisgICAgCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICB2YWx1ZV9pbml0aWFsaXplZCgpCisgICAgOgorICAgIG1fZGF0YSgpCisgICAgeyB9CisgICAgCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICBUIGNvbnN0ICYgZGF0YSgpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZGF0YS5kYXRhKCk7CisgICAgfQorCisgICAgQk9PU1RfR1BVX0VOQUJMRUQKKyAgICBUJiBkYXRhKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9kYXRhLmRhdGEoKTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIHZvaWQgc3dhcCh2YWx1ZV9pbml0aWFsaXplZCAmIGFyZykKKyAgICB7CisgICAgICBtX2RhdGEuc3dhcChhcmcubV9kYXRhKTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIG9wZXJhdG9yIFQgY29uc3QgJigpIGNvbnN0CisgICAgeworICAgICAgcmV0dXJuIG1fZGF0YTsKKyAgICB9CisKKyAgICBCT09TVF9HUFVfRU5BQkxFRAorICAgIG9wZXJhdG9yIFQmKCkKKyAgICB7CisgICAgICByZXR1cm4gbV9kYXRhOworICAgIH0KK30gOworCisKK3RlbXBsYXRlPGNsYXNzIFQ+CitCT09TVF9HUFVfRU5BQkxFRAorVCBjb25zdCYgZ2V0ICggdmFsdWVfaW5pdGlhbGl6ZWQ8VD4gY29uc3QmIHggKQoreworICByZXR1cm4geC5kYXRhKCkgOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorQk9PU1RfR1BVX0VOQUJMRUQKK1QmIGdldCAoIHZhbHVlX2luaXRpYWxpemVkPFQ+JiB4ICkKK3sKKyAgcmV0dXJuIHguZGF0YSgpIDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK0JPT1NUX0dQVV9FTkFCTEVECit2b2lkIHN3YXAgKCB2YWx1ZV9pbml0aWFsaXplZDxUPiAmIGxocywgdmFsdWVfaW5pdGlhbGl6ZWQ8VD4gJiByaHMgKQoreworICBsaHMuc3dhcChyaHMpIDsKK30KKworCitjbGFzcyBpbml0aWFsaXplZF92YWx1ZV90Cit7CisgIHB1YmxpYyA6CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IEJPT1NUX0dQVV9FTkFCTEVEIG9wZXJhdG9yIFQoKSBjb25zdAorICAgIHsKKyAgICAgIHJldHVybiBpbml0aWFsaXplZDxUPigpLmRhdGEoKTsKKyAgICB9Cit9OworCitpbml0aWFsaXplZF92YWx1ZV90IGNvbnN0IGluaXRpYWxpemVkX3ZhbHVlID0ge30gOworCisKK30gLy8gbmFtZXNwYWNlIGJvb3N0CisKKyNpZmRlZiBCT09TVF9NU1ZDCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5kZXguaHRtbCBiL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmYTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luZGV4Lmh0bWwKQEAgLTAsMCArMSw0OCBAQAorPGh0bWw+CisJPGhlYWQ+CisJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKwkJPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDUuMCI+CisJCTxtZXRhIG5hbWU9IlByb2dJZCIgY29udGVudD0iRnJvbnRQYWdlLkVkaXRvci5Eb2N1bWVudCI+CisJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+CisJCTx0aXRsZT5Cb29zdCBVdGlsaXR5IExpYnJhcnk8L3RpdGxlPgorCTwvaGVhZD4KKwk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KKwkJPGgxPjxJTUcgU1JDPSIuLi8uLi9ib29zdC5wbmciIFdJRFRIPSIyNzYiIEhFSUdIVD0iODYiIGFsaWduPSJjZW50ZXIiPkJvb3N0IAorCQkJVXRpbGl0eSBMaWJyYXJ5PC9oMT4KKwkJPHA+VGhlIEJvb3N0IFV0aWxpdHkgTGlicmFyeSBpc24ndCByZWFsbHkgYSBzaW5nbGUgbGlicmFyeSBhdCBhbGwuIEl0IGlzIGp1c3QgYSAKKwkJCWNvbGxlY3Rpb24gZm9yIGNvbXBvbmVudHMgdG9vIHNtYWxsIHRvIGJlIGNhbGxlZCBsaWJyYXJpZXMgaW4gdGhlaXIgb3duIHJpZ2h0LjwvcD4KKwkJPHA+QnV0IHRoYXQgZG9lc24ndCBtZWFuIHRoZXJlIGlzbid0IHVzZWZ1bCBzdHVmZiBoZXJlLiBUYWtlIGEgbG9vazo8L3A+CisJCTxibG9ja3F1b3RlPgorCQkJPHA+CisJCQkJPGEgaHJlZj0iLi4vY29yZS9kb2MvaHRtbC9jb3JlL2FkZHJlc3NvZi5odG1sIj5hZGRyZXNzb2Y8L2E+IChtb3ZlZCB0byB0aGUgQm9vc3QuQ29yZSBsaWJyYXJ5KTxicj4KKwkJCQk8YSBocmVmPSJkb2MvaHRtbC9iYXNlX2Zyb21fbWVtYmVyLmh0bWwiPmJhc2VfZnJvbV9tZW1iZXI8L2E+PGJyPgorCQkJCTxhIGhyZWY9InV0aWxpdHkuaHRtI0JPT1NUX0JJTkFSWSI+Qk9PU1RfQklOQVJZPC9hPjxicj4KKwkJCQk8YSBocmVmPSJjYWxsX3RyYWl0cy5odG0iPmNhbGxfdHJhaXRzPC9hPjxicj4KKwkJCQk8YSBocmVmPSIuLi9jb3JlL2RvYy9odG1sL2NvcmUvY2hlY2tlZF9kZWxldGUuaHRtbCI+Y2hlY2tlZF9kZWxldGU8L2E+IChtb3ZlZCB0byB0aGUgQm9vc3QuQ29yZSBsaWJyYXJ5KTxicj4KKwkJCQk8YSBocmVmPSJkb2MvaHRtbC9jb21wcmVzc2VkX3BhaXIuaHRtbCI+Y29tcHJlc3NlZF9wYWlyPC9hPjxicj4KKwkJCQk8YSBocmVmPSIuLi90eXBlX3RyYWl0cy9kb2MvaHRtbC9ib29zdF90eXBldHJhaXRzL3JlZmVyZW5jZS9kZWNsdmFsLmh0bWwiPmRlY2x2YWw8L2E+IChtb3ZlZCB0byB0aGUgQm9vc3QuVHlwZVRyYWl0cyBsaWJyYXJ5KTxicj4KKwkJCQk8YSBocmVmPSIuLi9jb3JlL2RvYy9odG1sL2NvcmUvZW5hYmxlX2lmLmh0bWwiPmVuYWJsZV9pZjwvYT4gKG1vdmVkIHRvIHRoZSBCb29zdC5Db3JlIGxpYnJhcnkpPGJyPgorCQkJCTxhIGhyZWY9ImluX3BsYWNlX2ZhY3Rvcmllcy5odG1sIj5pbl9wbGFjZV9mYWN0b3J5PC9hPjxicj4KKwkJCQk8YSBocmVmPSJpdGVyYXRvcl9hZGFwdG9ycy5odG0iPml0ZXJhdG9yX2FkYXB0b3JzPC9hPjxicj4KKwkJCQk8YSBocmVmPSIuLi9pdGVyYXRvci9kb2MvZ2VuZXJhdG9yX2l0ZXJhdG9yLmh0bSI+Z2VuZXJhdG9yIGl0ZXJhdG9yIGFkYXB0b3JzPC9hPiAobW92ZWQgdG8gdGhlIEJvb3N0Lkl0ZXJhdG9yIGxpYnJhcnkpPGJyPgorCQkJCTxhIGhyZWY9Ii4uL2l0ZXJhdG9yL2RvYy9odG1sL2l0ZXJhdG9yL2FsZ29yaXRobXMvbmV4dF9wcmlvci5odG1sIj5uZXh0L3ByaW9yPC9hPiAobW92ZWQgdG8gdGhlIEJvb3N0Lkl0ZXJhdG9yIGxpYnJhcnkpPGJyPgorCQkJCTxhIGhyZWY9Ii4uL2NvcmUvZG9jL2h0bWwvY29yZS9ub25jb3B5YWJsZS5odG1sIj5ub25jb3B5YWJsZTwvYT4gKG1vdmVkIHRvIHRoZSBCb29zdC5Db3JlIGxpYnJhcnkpPGJyPgorCQkJCTxhIGhyZWY9Im9wZXJhdG9ycy5odG0iPm9wZXJhdG9yczwvYT48YnI+CisJCQkJPGEgaHJlZj0idXRpbGl0eS5odG0jcmVzdWx0X29mIj5yZXN1bHRfb2Y8L2E+PGJyPgorCQkJCTxhIGhyZWY9InRocm93X2V4Y2VwdGlvbi5odG1sIj50aHJvd19leGNlcHRpb248L2E+PGJyPgorCQkJCTxhIGhyZWY9InV0aWxpdHkuaHRtIj51dGlsaXR5PC9hPjxicj4KKyAgICAgICAgICAgIDxhIGhyZWY9ImRvYy9odG1sL3N0cmluZ19yZWYuaHRtbCI+c3RyaW5nX3JlZjwvYT48YnI+CisgICAgICAgICAgICA8YSBocmVmPSJ2YWx1ZV9pbml0Lmh0bSI+dmFsdWVfaW5pdDwvYT48YnI+CisgICAgICAgICA8L3A+CisJCTwvYmxvY2txdW90ZT4KKwkJPGhyPgorCQk8cD4mY29weTsgQ29weXJpZ2h0IEJlbWFuIERhd2VzLCAyMDAxPC9wPgorICAgICAgICA8cD5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgCisgICAgICAgIGFjY29tcGFueWluZyBmaWxlIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+CisgICAgICAgIExJQ0VOU0VfMV8wLnR4dDwvYT4gb3IgY29weSBhdAorICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPgorICAgICAgICB3d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9wPgorCQk8cD5SZXZpc2VkIAorCQkJPCEtLXdlYmJvdCBib3Q9IlRpbWVzdGFtcCIgUy1UeXBlPSJFRElURUQiIFMtRm9ybWF0PSIlZCAlQiwgJVkiIHN0YXJ0c3BhbiAtLT4wNyBOb3ZlbWJlciwgMjAwNjwhLS13ZWJib3QgYm90PSJUaW1lc3RhbXAiIGVuZHNwYW4gaS1jaGVja3N1bT0iMzkzNjgiIC0tPjwvcD4KKwkJPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvaXRlcmF0b3JfYWRhcHRvcnMuaHRtIGIvaXRlcmF0b3JfYWRhcHRvcnMuaHRtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzJhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9pdGVyYXRvcl9hZGFwdG9ycy5odG0KQEAgLTAsMCArMSwxMSBAQAorPCEtLSBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwNC4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IC0tPgorPCEtLSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgLS0+Cis8IS0tIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KSAtLT4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwOyBVUkw9Li4vaXRlcmF0b3IvZG9jL2luZGV4Lmh0bWwiPgorPC9oZWFkPgorPGJvZHk+CitUaGlzIGRvY3VtZW50YXRpb24gbW92ZWQgdG8gPGEgaHJlZj0iLi4vaXRlcmF0b3IvZG9jL2luZGV4Lmh0bWwiPi4uL2l0ZXJhdG9yL2RvYy9pbmRleC5odG1sPC9hPi4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL21ldGEvbGlicmFyaWVzLmpzb24gYi9tZXRhL2xpYnJhcmllcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzRkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZXRhL2xpYnJhcmllcy5qc29uCkBAIC0wLDAgKzEsMTEzIEBACitbCisgICAgeworICAgICAgICAia2V5IjogInV0aWxpdHkiLAorICAgICAgICAibmFtZSI6ICJVdGlsaXR5IiwKKyAgICAgICAgImF1dGhvcnMiOiBbCisgICAgICAgICAgICAiRGF2ZSBBYnJhaGFtcyBhbmQgb3RoZXJzIgorICAgICAgICBdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ2xhc3Mgbm9uY29weWFibGUgcGx1cyBjaGVja2VkX2RlbGV0ZSgpLCBjaGVja2VkX2FycmF5X2RlbGV0ZSgpLCBuZXh0KCksIHByaW9yKCkgZnVuY3Rpb24gdGVtcGxhdGVzLCBwbHVzIGJhc2UtZnJvbS1tZW1iZXIgaWRpb20uIiwKKyAgICAgICAgImRvY3VtZW50YXRpb24iOiAidXRpbGl0eS5odG0iLAorICAgICAgICAiY2F0ZWdvcnkiOiBbCisgICAgICAgICAgICAiQWxnb3JpdGhtcyIsCisgICAgICAgICAgICAiRnVuY3Rpb24tb2JqZWN0cyIsCisgICAgICAgICAgICAiTWVtb3J5IiwKKyAgICAgICAgICAgICJNaXNjZWxsYW5lb3VzIiwKKyAgICAgICAgICAgICJQYXR0ZXJucyIKKyAgICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgICAia2V5IjogInV0aWxpdHkvY2FsbF90cmFpdHMiLAorICAgICAgICAibmFtZSI6ICJDYWxsIFRyYWl0cyIsCisgICAgICAgICJhdXRob3JzIjogWworICAgICAgICAgICAgIkpvaG4gTWFkZG9jaywgSG93YXJkIEhpbm5hbnQsIGV0IGFsIgorICAgICAgICBdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmaW5lcyB0eXBlcyBmb3IgcGFzc2luZyBwYXJhbWV0ZXJzLiIsCisgICAgICAgICJkb2N1bWVudGF0aW9uIjogImNhbGxfdHJhaXRzLmh0bSIsCisgICAgICAgICJjYXRlZ29yeSI6IFsKKyAgICAgICAgICAgICJHZW5lcmljIgorICAgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAgICJrZXkiOiAidXRpbGl0eS9jb21wcmVzc2VkX3BhaXIiLAorICAgICAgICAibmFtZSI6ICJDb21wcmVzc2VkIFBhaXIiLAorICAgICAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgICAgICJKb2huIE1hZGRvY2ssIEhvd2FyZCBIaW5uYW50LCBldCBhbCIKKyAgICAgICAgXSwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIkVtcHR5IG1lbWJlciBvcHRpbWl6YXRpb24uIiwKKyAgICAgICAgImRvY3VtZW50YXRpb24iOiAiY29tcHJlc3NlZF9wYWlyLmh0bSIsCisgICAgICAgICJjYXRlZ29yeSI6IFsKKyAgICAgICAgICAgICJEYXRhIiwKKyAgICAgICAgICAgICJQYXR0ZXJucyIKKyAgICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgICAia2V5IjogInV0aWxpdHkvaWRlbnRpdHlfdHlwZSIsCisgICAgICAgICJuYW1lIjogIklkZW50aXR5IFR5cGUiLAorICAgICAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgICAgICJMb3JlbnpvIENhbWluaXRpIgorICAgICAgICBdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiV3JhcCB0eXBlcyB3aXRoaW4gcm91bmQgcGFyZW50aGVzaXMgc28gdGhleSBjYW4gYWx3YXlzIGJlIHBhc3NlZCBhcyBtYWNybyBwYXJhbWV0ZXJzLiIsCisgICAgICAgICJkb2N1bWVudGF0aW9uIjogImlkZW50aXR5X3R5cGUvIiwKKyAgICAgICAgImNhdGVnb3J5IjogWworICAgICAgICAgICAgIlByZXByb2Nlc3NvciIKKyAgICAgICAgXSwKKyAgICAgICAgIm1haW50YWluZXJzIjogWworICAgICAgICAgICAgIkxvcmVuem8gQ2FtaW5pdGkgPGxvcmNhbWluaXRpIC1hdC0gZ21haWwuY29tPiIKKyAgICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgICAia2V5IjogInV0aWxpdHkvaW5fcGxhY2VfZmFjdG9yaWVzIiwKKyAgICAgICAgIm5hbWUiOiAiSW4gUGxhY2UgRmFjdG9yeSwgVHlwZWQgSW4gUGxhY2UgRmFjdG9yeSIsCisgICAgICAgICJhdXRob3JzIjogWworICAgICAgICAgICAgIkZlcm5hbmRvIENhY2Npb2xhIgorICAgICAgICBdLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiR2VuZXJpYyBpbi1wbGFjZSBjb25zdHJ1Y3Rpb24gb2YgY29udGFpbmVkIG9iamVjdHMgd2l0aCBhIHZhcmlhZGljIGFyZ3VtZW50LWxpc3QuIiwKKyAgICAgICAgImRvY3VtZW50YXRpb24iOiAiaW5fcGxhY2VfZmFjdG9yaWVzLmh0bWwiLAorICAgICAgICAiY2F0ZWdvcnkiOiBbCisgICAgICAgICAgICAiR2VuZXJpYyIKKyAgICAgICAgXQorICAgIH0sCisgICAgeworICAgICAgICAia2V5IjogInV0aWxpdHkvb3BlcmF0b3JzIiwKKyAgICAgICAgIm5hbWUiOiAiT3BlcmF0b3JzIiwKKyAgICAgICAgImF1dGhvcnMiOiBbCisgICAgICAgICAgICAiRGF2ZSBBYnJhaGFtcyIsCisgICAgICAgICAgICAiSmVyZW15IFNpZWsiCisgICAgICAgIF0sCisgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUZW1wbGF0ZXMgZWFzZSBhcml0aG1ldGljIGNsYXNzZXMgYW5kIGl0ZXJhdG9ycy4iLAorICAgICAgICAiZG9jdW1lbnRhdGlvbiI6ICJvcGVyYXRvcnMuaHRtIiwKKyAgICAgICAgImNhdGVnb3J5IjogWworICAgICAgICAgICAgIkdlbmVyaWMiLAorICAgICAgICAgICAgIkl0ZXJhdG9ycyIsCisgICAgICAgICAgICAiTWF0aCIKKyAgICAgICAgXSwKKyAgICAgICAgIm1haW50YWluZXJzIjogWworICAgICAgICAgICAgIkRhbmllbCBGcmV5IDxkLmZyZXkgLWF0LSBnbXguZGU+IgorICAgICAgICBdCisgICAgfSwKKyAgICB7CisgICAgICAgICJrZXkiOiAidXRpbGl0eS9yZXN1bHRfb2YiLAorICAgICAgICAibmFtZSI6ICJSZXN1bHQgT2YiLAorICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uIGNhbGwgZXhwcmVzc2lvbi4iLAorICAgICAgICAiZG9jdW1lbnRhdGlvbiI6ICJ1dGlsaXR5Lmh0bSNyZXN1bHRfb2YiLAorICAgICAgICAiY2F0ZWdvcnkiOiBbCisgICAgICAgICAgICAiRnVuY3Rpb24tb2JqZWN0cyIKKyAgICAgICAgXSwKKyAgICAgICAgImF1dGhvcnMiOiAiIiwKKyAgICAgICAgIm1haW50YWluZXJzIjogWworICAgICAgICAgICAgIkRhbmllbCBXYWxrZXIgPGRhbmllbC5qLndhbGtlciAtYXQtIGdtYWlsLmNvbT4iCisgICAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICAgImtleSI6ICJ1dGlsaXR5L3ZhbHVlX2luaXRpYWxpemVkIiwKKyAgICAgICAgIm5hbWUiOiAiVmFsdWUgSW5pdGlhbGl6ZWQiLAorICAgICAgICAiYXV0aG9ycyI6IFsKKyAgICAgICAgICAgICJGZXJuYW5kbyBDYWNjaW9sYSIKKyAgICAgICAgXSwKKyAgICAgICAgImRlc2NyaXB0aW9uIjogIldyYXBwZXIgZm9yIHVuaWZvcm0tc3ludGF4IHZhbHVlIGluaXRpYWxpemF0aW9uLCBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgaWRlYSBvZiBEYXZpZCBBYnJhaGFtcy4iLAorICAgICAgICAiZG9jdW1lbnRhdGlvbiI6ICJ2YWx1ZV9pbml0Lmh0bSIsCisgICAgICAgICJjYXRlZ29yeSI6IFsKKyAgICAgICAgICAgICJNaXNjZWxsYW5lb3VzIgorICAgICAgICBdCisgICAgfQorXQpkaWZmIC0tZ2l0IGEvb3BlcmF0b3JzLmh0bSBiL29wZXJhdG9ycy5odG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDM2YwotLS0gL2Rldi9udWxsCisrKyBiL29wZXJhdG9ycy5odG0KQEAgLTAsMCArMSwyMTQ0IEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yLy9FTiI+CisKKzxodG1sPgorICA8aGVhZD4KKyAgICA8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9CisgICAgIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxc3QgQXVndXN0IDIwMDIpLCBzZWUgd3d3LnczLm9yZyI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisKKyAgICA8dGl0bGU+SGVhZGVyICZsdDtib29zdC9vcGVyYXRvcnMuaHBwJmd0OyBEb2N1bWVudGF0aW9uPC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5IHRleHQ9ImJsYWNrIiBiZ2NvbG9yPSJ3aGl0ZSIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSIgYWxpbms9InJlZCI+CisgICAgPGgxPjxpbWcgc3JjPSIuLi8uLi9ib29zdC5wbmciIGFsdD0iYm9vc3QucG5nICg2ODk3IGJ5dGVzKSIgYWxpZ249CisgICAgIm1pZGRsZSIgd2lkdGg9IjI3NyIgaGVpZ2h0PSI4NiI+SGVhZGVyIDxjaXRlPiZsdDs8YSBocmVmPQorICAgICIuLi8uLi9ib29zdC9vcGVyYXRvcnMuaHBwIj5ib29zdC9vcGVyYXRvcnMuaHBwPC9hPiZndDs8L2NpdGU+PC9oMT4KKworICAgIDxwPlRoZSBoZWFkZXIgPGNpdGU+Jmx0OzxhIGhyZWY9CisgICAgIi4uLy4uL2Jvb3N0L29wZXJhdG9ycy5ocHAiPmJvb3N0L29wZXJhdG9ycy5ocHA8L2E+Jmd0OzwvY2l0ZT4gc3VwcGxpZXMKKyAgICBzZXZlcmFsIHNldHMgb2YgY2xhc3MgdGVtcGxhdGVzIChpbiBuYW1lc3BhY2UgPGNvZGU+Ym9vc3Q8L2NvZGU+KS4gVGhlc2UKKyAgICB0ZW1wbGF0ZXMgZGVmaW5lIG9wZXJhdG9ycyBhdCBuYW1lc3BhY2Ugc2NvcGUgaW4gdGVybXMgb2YgYSBtaW5pbWFsCisgICAgbnVtYmVyIG9mIGZ1bmRhbWVudGFsIG9wZXJhdG9ycyBwcm92aWRlZCBieSB0aGUgY2xhc3MuPC9wPgorCisgICAgPGgyPjxhIG5hbWU9ImNvbnRlbnRzIj5Db250ZW50czwvYT48L2gyPgorCisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9IiNjb250ZW50cyI+Q29udGVudHM8L2E+PC9saT4KKworICAgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjcmF0aW9uYWxlIj5SYXRpb25hbGU8L2E+IAorCisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI3NlbWFudGljcyI+U3VtbWFyeSBvZiBUZW1wbGF0ZSBTZW1hbnRpY3M8L2E+PC9saT4KKworICAgICAgICAgIDxsaT48YSBocmVmPSIjY29uY2VwdHNfbm90ZSI+VXNlIG9mIDxpPmNvbmNlcHRzPC9pPjwvYT48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9saT4KKworICAgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjdXNhZ2UiPlVzYWdlPC9hPiAKKworICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI3R3b19hcmciPlR3by1Bcmd1bWVudCBUZW1wbGF0ZSBGb3JtczwvYT4gCisKKyAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN0d29fYXJnX2dlbiI+R2VuZXJhbCBDb25zaWRlcmF0aW9uczwvYT48L2xpPgorCisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjbWl4ZWRfYXJpdGhtZXRpY3MiPk1peGVkIGFyaXRobWV0aWNzPC9hPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvbGk+CisKKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2NoYWluaW5nIj5CYXNlIENsYXNzIENoYWluaW5nIGFuZCBPYmplY3QKKyAgICAgICAgICBTaXplPC9hPjwvbGk+CisKKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2V4cGxpY2l0X2luc3RhbnRpYXRpb24iPlNlcGFyYXRlLCBFeHBsaWNpdAorICAgICAgICAgIEluc3RhbnRpYXRpb248L2E+PC9saT4KKworICAgICAgICAgIDxsaT48YSBocmVmPSIjcG9ydGFiaWxpdHkiPlJlcXVpcmVtZW50IFBvcnRhYmlsaXR5PC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorCisgICAgICA8bGk+PGEgaHJlZj0iI2V4YW1wbGUiPkV4YW1wbGU8L2E+PC9saT4KKworICAgICAgPGxpPgorICAgICAgICA8YSBocmVmPSIjYXJpdGhtZXRpYyI+QXJpdGhtZXRpYyBvcGVyYXRvcnM8L2E+IAorCisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+CisgICAgICAgICAgICA8YSBocmVmPSIjc21wbF9vcHJzIj5TaW1wbGUgQXJpdGhtZXRpYyBPcGVyYXRvcnM8L2E+IAorCisgICAgICAgICAgICA8dWw+CisgICAgICAgICAgICAgIDxsaT48YSBocmVmPSIjb3JkZXJpbmciPk9yZGVyaW5nIE5vdGU8L2E+PC9saT4KKworICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPjwvbGk+CisgICAgICAgICAgICA8L3VsPgorICAgICAgICAgIDwvbGk+CisKKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2dycGRfb3BycyI+R3JvdXBlZCBBcml0aG1ldGljIE9wZXJhdG9yczwvYT48L2xpPgorCisgICAgICAgICAgPGxpPjxhIGhyZWY9IiNleF9vcHJzIj5FeGFtcGxlIFRlbXBsYXRlczwvYT48L2xpPgorCisgICAgICAgICAgPGxpPjxhIGhyZWY9IiNhX2RlbW8iPkFyaXRobWV0aWMgT3BlcmF0b3JzIERlbW9uc3RyYXRpb24gYW5kIFRlc3QKKyAgICAgICAgICBQcm9ncmFtPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorCisgICAgICA8bGk+CisgICAgICAgIDxhIGhyZWY9IiNkZXJlZiI+RGVyZWZlcmVuY2UgT3BlcmF0b3JzIGFuZCBJdGVyYXRvciBIZWxwZXJzPC9hPiAKKworICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPjxhIGhyZWY9IiNkZXJlZmVyZW5jZSI+RGVyZWZlcmVuY2Ugb3BlcmF0b3JzPC9hPjwvbGk+CisKKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2dycGRfaXRlcl9vcHJzIj5Hcm91cGVkIEl0ZXJhdG9yIE9wZXJhdG9yczwvYT48L2xpPgorCisgICAgICAgICAgPGxpPgorICAgICAgICAgICAgPGEgaHJlZj0iI2l0ZXJhdG9yIj5JdGVyYXRvciBIZWxwZXJzPC9hPiAKKworICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2l0ZXJhdG9yX2hlbHBlcnNfbm90ZXMiPkl0ZXJhdG9yIEhlbHBlcgorICAgICAgICAgICAgICBOb3RlczwvYT48L2xpPgorICAgICAgICAgICAgPC91bD4KKyAgICAgICAgICA8L2xpPgorCisgICAgICAgICAgPGxpPjxhIGhyZWY9IiNpX2RlbW8iPkl0ZXJhdG9yIERlbW9uc3RyYXRpb24gYW5kIFRlc3QKKyAgICAgICAgICBQcm9ncmFtPC9hPjwvbGk+CisgICAgICAgIDwvdWw+CisgICAgICA8L2xpPgorCisgICAgICA8bGk+PGEgaHJlZj0iI2NvbnRyaWJ1dG9ycyI+Q29udHJpYnV0b3JzPC9hPjwvbGk+CisKKyAgICAgIDxsaT48YSBocmVmPSIjb2xkX2xpYl9ub3RlIj5Ob3RlIGZvciBVc2VycyBvZiBPbGRlciBWZXJzaW9uczwvYT48L2xpPgorICAgIDwvdWw+CisKKyAgICA8aDI+PGEgbmFtZT0icmF0aW9uYWxlIj5SYXRpb25hbGU8L2E+PC9oMj4KKworICAgIDxwPk92ZXJsb2FkZWQgb3BlcmF0b3JzIGZvciBjbGFzcyB0eXBlcyB0eXBpY2FsbHkgb2NjdXIgaW4gZ3JvdXBzLiBJZiB5b3UKKyAgICBjYW4gd3JpdGUgPGNvZGU+eCZuYnNwOysmbmJzcDt5PC9jb2RlPiwgeW91IHByb2JhYmx5IGFsc28gd2FudCB0byBiZSBhYmxlCisgICAgdG8gd3JpdGUgPGNvZGU+eCArPSB5PC9jb2RlPi4gSWYgeW91IGNhbiB3cml0ZSA8Y29kZT54ICZsdDsgeSw8L2NvZGU+IHlvdQorICAgIGFsc28gd2FudCA8Y29kZT54ICZndDsgeSwgeCAmZ3Q7PSB5LDwvY29kZT4gYW5kIDxjb2RlPnggJmx0Oz0geTwvY29kZT4uCisgICAgTW9yZW92ZXIsIHVubGVzcyB5b3VyIGNsYXNzIGhhcyByZWFsbHkgc3VycHJpc2luZyBiZWhhdmlvciwgc29tZSBvZiB0aGVzZQorICAgIHJlbGF0ZWQgb3BlcmF0b3JzIGNhbiBiZSBkZWZpbmVkIGluIHRlcm1zIG9mIG90aGVycyAoZS5nLiA8Y29kZT54ICZndDs9IHkKKyAgICAmbHQ7PSZndDsgISh4ICZsdDsgeSk8L2NvZGU+KS4gUmVwbGljYXRpbmcgdGhpcyBib2lsZXJwbGF0ZSBmb3IgbXVsdGlwbGUKKyAgICBjbGFzc2VzIGlzIGJvdGggdGVkaW91cyBhbmQgZXJyb3ItcHJvbmUuIFRoZSA8Y2l0ZT48YSBocmVmPQorICAgICIuLi8uLi9ib29zdC9vcGVyYXRvcnMuaHBwIj5ib29zdC9vcGVyYXRvcnMuaHBwPC9hPjwvY2l0ZT4gdGVtcGxhdGVzIGhlbHAKKyAgICBieSBnZW5lcmF0aW5nIG9wZXJhdG9ycyBmb3IgeW91IGF0IG5hbWVzcGFjZSBzY29wZSBiYXNlZCBvbiBvdGhlcgorICAgIG9wZXJhdG9ycyB5b3UndmUgZGVmaW5lZCBpbiB5b3VyIGNsYXNzLjwvcD4KKworICAgIDxwPklmLCBmb3IgZXhhbXBsZSwgeW91IGRlY2xhcmUgYSBjbGFzcyBsaWtlIHRoaXM6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+Cis8cHJlPgorY2xhc3MgTXlJbnQKKyAgICA6IGJvb3N0OjpvcGVyYXRvcnMmbHQ7TXlJbnQmZ3Q7Cit7CisgICAgYm9vbCBvcGVyYXRvciZsdDsoY29uc3QgTXlJbnQmYW1wOyB4KSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTXlJbnQmYW1wOyB4KSBjb25zdDsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yKz0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yLT0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yKj0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yLz0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yJT0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yfD0oY29uc3QgTXlJbnQmYW1wOyB4KTsKKyAgICBNeUludCZhbXA7IG9wZXJhdG9yJmFtcDs9KGNvbnN0IE15SW50JmFtcDsgeCk7CisgICAgTXlJbnQmYW1wOyBvcGVyYXRvcl49KGNvbnN0IE15SW50JmFtcDsgeCk7CisgICAgTXlJbnQmYW1wOyBvcGVyYXRvcisrKCk7CisgICAgTXlJbnQmYW1wOyBvcGVyYXRvci0tKCk7Cit9OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisgICAgPHA+dGhlbiB0aGUgPGNvZGU+PGEgaHJlZj0iI29wZXJhdG9yczEiPm9wZXJhdG9ycyZsdDsmZ3Q7PC9hPjwvY29kZT4KKyAgICB0ZW1wbGF0ZSBhZGRzIG1vcmUgdGhhbiBhIGRvemVuIGFkZGl0aW9uYWwgb3BlcmF0b3JzLCBzdWNoIGFzCisgICAgPGNvZGU+b3BlcmF0b3ImZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0Oz08L2NvZGU+LCA8Y29kZT4mZ3Q7PTwvY29kZT4sIGFuZAorICAgIChiaW5hcnkpIDxjb2RlPis8L2NvZGU+LiA8YSBocmVmPSIjdHdvX2FyZyI+VHdvLWFyZ3VtZW50IGZvcm1zPC9hPiBvZiB0aGUKKyAgICB0ZW1wbGF0ZXMgYXJlIGFsc28gcHJvdmlkZWQgdG8gYWxsb3cgaW50ZXJhY3Rpb24gd2l0aCBvdGhlciB0eXBlcy48L3A+CisKKyAgICA8aDM+U3VtbWFyeSBvZiBUZW1wbGF0ZSA8YSBuYW1lPSJzZW1hbnRpY3MiPlNlbWFudGljczwvYT48L2gzPgorCisgICAgPG9sPgorICAgICAgPGxpPkVhY2ggb3BlcmF0b3IgdGVtcGxhdGUgY29tcGxldGVzIHRoZSBjb25jZXB0KHMpIGl0IGRlc2NyaWJlcyBieQorICAgICAgZGVmaW5pbmcgb3ZlcmxvYWRlZCBvcGVyYXRvcnMgZm9yIGl0cyB0YXJnZXQgY2xhc3MuPC9saT4KKworICAgICAgPGxpPlRoZSBuYW1lIG9mIGFuIG9wZXJhdG9yIGNsYXNzIHRlbXBsYXRlIGluZGljYXRlcyB0aGUgPGEgaHJlZj0KKyAgICAgICIjY29uY2VwdHNfbm90ZSI+Y29uY2VwdDwvYT4gdGhhdCBpdHMgdGFyZ2V0IGNsYXNzIHdpbGwgbW9kZWwuPC9saT4KKworICAgICAgPGxpPlVzdWFsbHksIHRoZSB0YXJnZXQgY2xhc3MgdXNlcyBhbiBpbnN0YW50YXRpb24gb2YgdGhlIG9wZXJhdG9yCisgICAgICBjbGFzcyB0ZW1wbGF0ZSBhcyBhIGJhc2UgY2xhc3MuIFNvbWUgb3BlcmF0b3IgdGVtcGxhdGVzIHN1cHBvcnQgYW4gPGEKKyAgICAgIGhyZWY9IiNleHBsaWNpdF9pbnN0YW50aWF0aW9uIj5hbHRlcm5hdGUgbWV0aG9kPC9hPi48L2xpPgorCisgICAgICA8bGk+VGhlIGNvbmNlcHQgY2FuIGJlIGNvbXBvdW5kLCA8aT5pLmUuPC9pPiBpdCBtYXkgcmVwcmVzZW50IGEgY29tbW9uCisgICAgICBjb21iaW5hdGlvbiBvZiBvdGhlciwgc2ltcGxlciBjb25jZXB0cy48L2xpPgorCisgICAgICA8bGk+TW9zdCBvcGVyYXRvciB0ZW1wbGF0ZXMgcmVxdWlyZSB0aGVpciB0YXJnZXQgY2xhc3MgdG8gc3VwcG9ydAorICAgICAgb3BlcmF0aW9ucyByZWxhdGVkIHRvIHRoZSBvcGVyYXRvcnMgc3VwcGxpZWQgYnkgdGhlIHRlbXBsYXRlLiBJbgorICAgICAgYWNjb3JkYW5jZSB3aXRoIHdpZGVseSBhY2NlcHRlZCA8YSBocmVmPQorICAgICAgImh0dHA6Ly93d3cuZ290dy5jYS9nb3R3LzAwNC5odG0iPmNvZGluZyBzdHlsZSByZWNvbW1lbmRhdGlvbnM8L2E+LCB0aGUKKyAgICAgIHRhcmdldCBjbGFzcyBpcyBvZnRlbiByZXF1aXJlZCB0byBzdXBwbHkgdGhlIGFzc2lnbm1lbnQgY291bnRlcnBhcnQKKyAgICAgIG9wZXJhdG9yIG9mIHRoZSBjb25jZXB0J3MgIm1haW4gb3BlcmF0b3IuIiBGb3IgZXhhbXBsZSwgdGhlCisgICAgICA8Y29kZT5hZGRhYmxlPC9jb2RlPiB0ZW1wbGF0ZSByZXF1aXJlcyA8Y29kZT5vcGVyYXRvcis9KFQKKyAgICAgIGNvbnN0JmFtcDspPC9jb2RlPiBhbmQgaW4gdHVybiBzdXBwbGllcyA8Y29kZT5vcGVyYXRvcisoVCBjb25zdCZhbXA7LCBUCisgICAgICBjb25zdCZhbXA7KTwvY29kZT4uPC9saT4KKyAgICA8L29sPgorCisgICAgPGgzPlVzZSBvZiA8aT48YSBuYW1lPSJjb25jZXB0c19ub3RlIj5jb25jZXB0czwvYT48L2k+PC9oMz4KKworICAgIDxwPlRoZSBkaXNjdXNzZWQgY29uY2VwdHMgYXJlIG5vdCBuZWNlc3NhcmlseSB0aGUgc3RhbmRhcmQgbGlicmFyeSdzCisgICAgY29uY2VwdHMgKENvcHlDb25zdHJ1Y3RpYmxlLCA8aT5ldGMuPC9pPiksIGFsdGhvdWdoIHNvbWUgb2YgdGhlbSBjb3VsZAorICAgIGJlOyB0aGV5IGFyZSB3aGF0IHdlIGNhbGwgPGk+Y29uY2VwdHMgd2l0aCBhIHNtYWxsICdjJzwvaT4uIEluCisgICAgcGFydGljdWxhciwgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGZvcm1lciBvbmVzIGluIHRoYXQgdGhleSA8ZW0+ZG8KKyAgICBub3Q8L2VtPiBkZXNjcmliZSBwcmVjaXNlIHNlbWFudGljcyBvZiB0aGUgb3BlcmF0b3JzIHRoZXkgcmVxdWlyZSB0byBiZQorICAgIGRlZmluZWQsIGV4Y2VwdCB0aGUgcmVxdWlyZW1lbnRzIHRoYXQgKGEpIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIG9wZXJhdG9ycworICAgIGdyb3VwZWQgaW4gb25lIGNvbmNlcHQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgKDxpPmUuZy48L2k+IGVmZmVjdHMgb2YKKyAgICBldmFsdWF0aW5nIG9mIDxjb2RlPmEgKz0gYjwvY29kZT4gYW5kCisgICAgPGNvZGU+YSZuYnNwOz0mbmJzcDthJm5ic3A7KyZuYnNwO2I8L2NvZGU+IGV4cHJlc3Npb25zIHNob3VsZCBiZSB0aGUKKyAgICBzYW1lKSwgYW5kIChiKSB0aGF0IHRoZSByZXR1cm4gdHlwZXMgb2YgdGhlIG9wZXJhdG9ycyBzaG91bGQgZm9sbG93CisgICAgc2VtYW50aWNzIG9mIHJldHVybiB0eXBlcyBvZiBjb3JyZXNwb25kaW5nIG9wZXJhdG9ycyBmb3IgYnVpbHQtaW4gdHlwZXMKKyAgICAoPGk+ZS5nLjwvaT4gPGNvZGU+b3BlcmF0b3ImbHQ7PC9jb2RlPiBzaG91bGQgcmV0dXJuIGEgdHlwZSBjb252ZXJ0aWJsZQorICAgIHRvIDxjb2RlPmJvb2w8L2NvZGU+LCBhbmQgPGNvZGU+VDo6b3BlcmF0b3ItPTwvY29kZT4gc2hvdWxkIHJldHVybiB0eXBlCisgICAgY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4pLiBTdWNoICJsb29zZSIgcmVxdWlyZW1lbnRzIG1ha2Ugb3BlcmF0b3JzCisgICAgbGlicmFyeSBhcHBsaWNhYmxlIHRvIGJyb2FkZXIgc2V0IG9mIHRhcmdldCBjbGFzc2VzIGZyb20gZGlmZmVyZW50CisgICAgZG9tYWlucywgPGk+aS5lLjwvaT4gZXZlbnR1YWxseSBtb3JlIHVzZWZ1bC48L3A+CisKKyAgICA8aDI+PGEgbmFtZT0idXNhZ2UiPlVzYWdlPC9hPjwvaDI+CisKKyAgICA8aDM+PGEgbmFtZT0idHdvX2FyZyI+VHdvLUFyZ3VtZW50PC9hPiBUZW1wbGF0ZSBGb3JtczwvaDM+CisKKyAgICA8aDQ+PGEgbmFtZT0idHdvX2FyZ19nZW4iPkdlbmVyYWwgQ29uc2lkZXJhdGlvbnM8L2E+PC9oND4KKworICAgIDxwPlRoZSBhcmd1bWVudHMgdG8gYSBiaW5hcnkgb3BlcmF0b3IgY29tbW9ubHkgaGF2ZSBpZGVudGljYWwgdHlwZXMsIGJ1dAorICAgIGl0IGlzIG5vdCB1bnVzdWFsIHRvIHdhbnQgdG8gZGVmaW5lIG9wZXJhdG9ycyB3aGljaCBjb21iaW5lIGRpZmZlcmVudAorICAgIHR5cGVzLiBGb3IgPGEgaHJlZj0iI2V4YW1wbGUiPmV4YW1wbGU8L2E+LCBvbmUgbWlnaHQgd2FudCB0byBtdWx0aXBseSBhCisgICAgbWF0aGVtYXRpY2FsIHZlY3RvciBieSBhIHNjYWxhci4gVGhlIHR3by1hcmd1bWVudCB0ZW1wbGF0ZSBmb3JtcyBvZiB0aGUKKyAgICBhcml0aG1ldGljIG9wZXJhdG9yIHRlbXBsYXRlcyBhcmUgc3VwcGxpZWQgZm9yIHRoaXMgcHVycG9zZS4gV2hlbgorICAgIGFwcGx5aW5nIHRoZSB0d28tYXJndW1lbnQgZm9ybSBvZiBhIHRlbXBsYXRlLCB0aGUgZGVzaXJlZCByZXR1cm4gdHlwZSBvZgorICAgIHRoZSBvcGVyYXRvcnMgdHlwaWNhbGx5IGRldGVybWluZXMgd2hpY2ggb2YgdGhlIHR3byB0eXBlcyBpbiBxdWVzdGlvbgorICAgIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gdGhlIG9wZXJhdG9yIHRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlc3VsdAorICAgIG9mIDxjb2RlPlQmbmJzcDsrJm5ic3A7VTwvY29kZT4gaXMgb2YgdHlwZSA8Y29kZT5UPC9jb2RlPiwgdGhlbgorICAgIDxjb2RlPlQ8L2NvZGU+IChub3QgPGNvZGU+VTwvY29kZT4pIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gPGNvZGU+PGEgaHJlZj0KKyAgICAiI2FkZGFibGUyIj5hZGRhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT4uIFRoZSBjb21wYXJpc29uIHRlbXBsYXRlcworICAgICg8Y29kZT48YSBocmVmPSIjbGVzc190aGFuX2NvbXBhcmFibGUyIj5sZXNzX3RoYW5fY29tcGFyYWJsZSZsdDtULAorICAgIFUmZ3Q7PC9hPjwvY29kZT4sIDxjb2RlPjxhIGhyZWY9CisgICAgIiNlcXVhbGl0eV9jb21wYXJhYmxlMiI+ZXF1YWxpdHlfY29tcGFyYWJsZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+LAorICAgIDxjb2RlPjxhIGhyZWY9IiNlcXVpdmFsZW50MiI+ZXF1aXZhbGVudCZsdDtULCBVJmd0OzwvYT48L2NvZGU+LCBhbmQKKyAgICA8Y29kZT48YSBocmVmPSIjcGFydGlhbGx5X29yZGVyZWQyIj5wYXJ0aWFsbHlfb3JkZXJlZCZsdDtULAorICAgIFUmZ3Q7PC9hPjwvY29kZT4pIGFyZSBleGNlcHRpb25zIHRvIHRoaXMgZ3VpZGVsaW5lLCBzaW5jZSB0aGUgcmV0dXJuIHR5cGUKKyAgICBvZiB0aGUgb3BlcmF0b3JzIHRoZXkgZGVmaW5lIGlzIDxjb2RlPmJvb2w8L2NvZGU+LjwvcD4KKworICAgIDxwPk9uIGNvbXBpbGVycyB3aGljaCBkbyBub3Qgc3VwcG9ydCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLCB0aGUKKyAgICB0d28tYXJndW1lbnQgZm9ybXMgbXVzdCBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgdGhlIG5hbWVzIHNob3duIGJlbG93IHdpdGgKKyAgICB0aGUgdHJhaWxpbmcgPGNvZGU+JzInPC9jb2RlPi4gVGhlIHNpbmdsZS1hcmd1bWVudCBmb3JtcyB3aXRoIHRoZQorICAgIHRyYWlsaW5nIDxjb2RlPicxJzwvY29kZT4gYXJlIHByb3ZpZGVkIGZvciBzeW1tZXRyeSBhbmQgdG8gZW5hYmxlIGNlcnRhaW4KKyAgICBhcHBsaWNhdGlvbnMgb2YgdGhlIDxhIGhyZWY9IiNjaGFpbmluZyI+YmFzZSBjbGFzcyBjaGFpbmluZzwvYT4KKyAgICB0ZWNobmlxdWUuPC9wPgorCisgICAgPGg0PjxhIG5hbWU9Im1peGVkX2FyaXRobWV0aWNzIj5NaXhlZCBBcml0aG1ldGljczwvYT48L2g0PgorCisgICAgPHA+QW5vdGhlciBhcHBsaWNhdGlvbiBvZiB0aGUgdHdvLWFyZ3VtZW50IHRlbXBsYXRlIGZvcm1zIGlzIGZvciBtaXhlZAorICAgIGFyaXRobWV0aWNzIGJldHdlZW4gYSB0eXBlIDxjb2RlPlQ8L2NvZGU+IGFuZCBhIHR5cGUgPGNvZGU+VTwvY29kZT4gdGhhdAorICAgIGlzIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBJbiB0aGlzIGNhc2UgdGhlcmUgYXJlIHR3byB3YXlzIHdoZXJlCisgICAgdGhlIHR3by1hcmd1bWVudCB0ZW1wbGF0ZSBmb3JtcyBhcmUgaGVscGZ1bDogb25lIGlzIHRvIHByb3ZpZGUgdGhlCisgICAgcmVzcGVjdGl2ZSBzaWduYXR1cmVzIGZvciBvcGVyYXRvciBvdmVybG9hZGluZywgdGhlIHNlY29uZCBpcworICAgIHBlcmZvcm1hbmNlLjwvcD4KKworICAgIDxwPldpdGggcmVzcGVjdCB0byB0aGUgb3BlcmF0b3Igb3ZlcmxvYWRpbmcgYXNzdW1lIDxpPmUuZy48L2k+IHRoYXQKKyAgICA8Y29kZT5VPC9jb2RlPiBpcyA8Y29kZT5pbnQ8L2NvZGU+LCB0aGF0IDxjb2RlPlQ8L2NvZGU+IGlzIGFuCisgICAgdXNlci1kZWZpbmVkIHVubGltaXRlZCBpbnRlZ2VyIHR5cGUsIGFuZCB0aGF0IDxjb2RlPmRvdWJsZQorICAgIG9wZXJhdG9yLShkb3VibGUsIGNvbnN0IFQmYW1wOyk8L2NvZGU+IGV4aXN0cy4gSWYgb25lIHdhbnRzIHRvIGNvbXB1dGUKKyAgICA8Y29kZT5pbnQgLSBUPC9jb2RlPiBhbmQgZG9lcyBub3QgcHJvdmlkZSA8Y29kZT5UIG9wZXJhdG9yLShpbnQsIGNvbnN0CisgICAgVCZhbXA7KTwvY29kZT4sIHRoZSBjb21waWxlciB3aWxsIGNvbnNpZGVyIDxjb2RlPmRvdWJsZSBvcGVyYXRvci0oZG91YmxlLAorICAgIGNvbnN0IFQmYW1wOyk8L2NvZGU+IHRvIGJlIGEgYmV0dGVyIG1hdGNoIHRoYW4gPGNvZGU+VCBvcGVyYXRvci0oY29uc3QKKyAgICBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+LCB3aGljaCB3aWxsIHByb2JhYmx5IGJlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgIHVzZXIncyBpbnRlbnRpb24uIFRvIGRlZmluZSBhIGNvbXBsZXRlIHNldCBvZiBvcGVyYXRvciBzaWduYXR1cmVzLAorICAgIGFkZGl0aW9uYWwgJ2xlZnQnIGZvcm1zIG9mIHRoZSB0d28tYXJndW1lbnQgdGVtcGxhdGUgZm9ybXMgYXJlIHByb3ZpZGVkCisgICAgKDxjb2RlPjxhIGhyZWY9IiNzdWJ0cmFjdGFibGUyX2xlZnQiPnN1YnRyYWN0YWJsZTJfbGVmdCZsdDtULAorICAgIFUmZ3Q7PC9hPjwvY29kZT4sIDxjb2RlPjxhIGhyZWY9IiNkaXZpZGFibGUyX2xlZnQiPmRpdmlkYWJsZTJfbGVmdCZsdDtULAorICAgIFUmZ3Q7PC9hPjwvY29kZT4sIDxjb2RlPjxhIGhyZWY9IiNtb2RhYmxlMl9sZWZ0Ij5tb2RhYmxlMl9sZWZ0Jmx0O1QsCisgICAgVSZndDs8L2E+PC9jb2RlPikgdGhhdCBkZWZpbmUgdGhlIHNpZ25hdHVyZXMgZm9yIG5vbi1jb21tdXRhdGl2ZQorICAgIG9wZXJhdG9ycyB3aGVyZSA8Y29kZT5VPC9jb2RlPiBhcHBlYXJzIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZQorICAgICg8Y29kZT5vcGVyYXRvci0oY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPiwKKyAgICA8Y29kZT5vcGVyYXRvci8oY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPiwgPGNvZGU+b3BlcmF0b3IlKGNvbnN0CisgICAgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPikuPC9wPgorCisgICAgPHA+V2l0aCByZXNwZWN0IHRvIHRoZSBwZXJmb3JtYW5jZSBvYnNlcnZlIHRoYXQgd2hlbiBvbmUgdXNlcyB0aGUgc2luZ2xlCisgICAgdHlwZSBiaW5hcnkgb3BlcmF0b3IgZm9yIG1peGVkIHR5cGUgYXJpdGhtZXRpY3MsIHRoZSB0eXBlIDxjb2RlPlU8L2NvZGU+CisgICAgYXJndW1lbnQgaGFzIHRvIGJlIGNvbnZlcnRlZCB0byB0eXBlIDxjb2RlPlQ8L2NvZGU+LiBJbiBwcmFjdGljZSwKKyAgICBob3dldmVyLCB0aGVyZSBhcmUgb2Z0ZW4gbW9yZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb25zIG9mLCBzYXkKKyAgICA8Y29kZT5UOjpvcGVyYXRvci09KGNvbnN0IFUmYW1wOyk8L2NvZGU+IHRoYXQgYXZvaWQgdW5uZWNlc3NhcnkKKyAgICBjb252ZXJzaW9ucyBmcm9tIDxjb2RlPlU8L2NvZGU+IHRvIDxjb2RlPlQ8L2NvZGU+LiBUaGUgdHdvLWFyZ3VtZW50CisgICAgdGVtcGxhdGUgZm9ybXMgb2YgdGhlIGFyaXRobWV0aWMgb3BlcmF0b3IgY3JlYXRlIGFkZGl0aW9uYWwgb3BlcmF0b3IKKyAgICBpbnRlcmZhY2VzIHRoYXQgdXNlIHRoZXNlIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9ucy4gVGhlcmUgaXMsCisgICAgaG93ZXZlciwgbm8gcGVyZm9ybWFuY2UgZ2FpbiBpbiB0aGUgJ2xlZnQnIGZvcm1zOiB0aGV5IHN0aWxsIG5lZWQgYQorICAgIGNvbnZlcnNpb24gZnJvbSA8Y29kZT5VPC9jb2RlPiB0byA8Y29kZT5UPC9jb2RlPiBhbmQgaGF2ZSBhbgorICAgIGltcGxlbWVudGF0aW9uIGVxdWl2YWxlbnQgdG8gdGhlIGNvZGUgdGhhdCB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQKKyAgICBieSB0aGUgY29tcGlsZXIgaWYgaXQgY29uc2lkZXJlZCB0aGUgc2luZ2xlIHR5cGUgYmluYXJ5IG9wZXJhdG9yIHRvIGJlCisgICAgdGhlIGJlc3QgbWF0Y2guPC9wPgorCisgICAgPGgzPkJhc2UgQ2xhc3MgPGEgbmFtZT0iY2hhaW5pbmciPkNoYWluaW5nPC9hPiBhbmQgT2JqZWN0IFNpemU8L2gzPgorCisgICAgPHA+RXZlcnkgb3BlcmF0b3IgY2xhc3MgdGVtcGxhdGUsIGV4Y2VwdCB0aGUgPGEgaHJlZj0KKyAgICAiI2V4X29wcnMiPmFyaXRobWV0aWMgZXhhbXBsZXM8L2E+IGFuZCB0aGUgPGEgaHJlZj0iI2l0ZXJhdG9yIj5pdGVyYXRvcgorICAgIGhlbHBlcnM8L2E+LCBoYXMgYW4gYWRkaXRpb25hbCwgYnV0IG9wdGlvbmFsLCB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlcgorICAgIDxjb2RlPkI8L2NvZGU+LiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIGEgcHVibGljbHktZGVyaXZlZCBiYXNlIGNsYXNzIG9mCisgICAgdGhlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZS4gVGhpcyBtZWFucyBpdCBtdXN0IGJlIGEgY2xhc3MgdHlwZS4gSXQgY2FuIGJlCisgICAgdXNlZCB0byBhdm9pZCB0aGUgYmxvYXRpbmcgb2Ygb2JqZWN0IHNpemVzIHRoYXQgaXMgY29tbW9ubHkgYXNzb2NpYXRlZAorICAgIHdpdGggbXVsdGlwbGUtaW5oZXJpdGFuY2UgZnJvbSBzZXZlcmFsIGVtcHR5IGJhc2UgY2xhc3NlcyAoc2VlIHRoZSA8YQorICAgIGhyZWY9IiNvbGRfbGliX25vdGUiPm5vdGUgZm9yIHVzZXJzIG9mIG9sZGVyIHZlcnNpb25zPC9hPiBmb3IgbW9yZQorICAgIGRldGFpbHMpLiBUbyBwcm92aWRlIHN1cHBvcnQgZm9yIGEgZ3JvdXAgb2Ygb3BlcmF0b3JzLCB1c2UgdGhlCisgICAgPGNvZGU+QjwvY29kZT4gcGFyYW1ldGVyIHRvIGNoYWluIG9wZXJhdG9yIHRlbXBsYXRlcyBpbnRvIGEgc2luZ2xlLWJhc2UKKyAgICBjbGFzcyBoaWVyYXJjaHksIGRlbW9zdHJhdGVkIGluIHRoZSA8YSBocmVmPSIjZXhhbXBsZSI+dXNhZ2UgZXhhbXBsZTwvYT4uCisgICAgVGhlIHRlY2huaXF1ZSBpcyBhbHNvIHVzZWQgYnkgdGhlIGNvbXBvc2l0ZSBvcGVyYXRvciB0ZW1wbGF0ZXMgdG8gZ3JvdXAKKyAgICBvcGVyYXRvciBkZWZpbml0aW9ucy4gSWYgYSBjaGFpbiBiZWNvbWVzIHRvbyBsb25nIGZvciB0aGUgY29tcGlsZXIgdG8KKyAgICBzdXBwb3J0LCB0cnkgcmVwbGFjaW5nIHNvbWUgb2YgdGhlIG9wZXJhdG9yIHRlbXBsYXRlcyB3aXRoIGEgc2luZ2xlCisgICAgZ3JvdXBlZCBvcGVyYXRvciB0ZW1wbGF0ZSB0aGF0IGNoYWlucyB0aGUgb2xkIHRlbXBsYXRlcyB0b2dldGhlcjsgdGhlCisgICAgbGVuZ3RoIGxpbWl0IG9ubHkgYXBwbGllcyB0byB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlcyBkaXJlY3RseSBpbiB0aGUKKyAgICBjaGFpbiwgbm90IHRob3NlIGhpZGRlbiBpbiBncm91cCB0ZW1wbGF0ZXMuPC9wPgorCisgICAgPHA+PHN0cm9uZz5DYXZlYXQ6PC9zdHJvbmc+IHRvIGNoYWluIHRvIGEgYmFzZSBjbGFzcyB3aGljaCBpcworICAgIDxlbT5ub3Q8L2VtPiBhIEJvb3N0IG9wZXJhdG9yIHRlbXBsYXRlIHdoZW4gdXNpbmcgdGhlIDxhIGhyZWY9CisgICAgIiN0d29fYXJnIj5zaW5nbGUtYXJndW1lbnQgZm9ybTwvYT4gb2YgYSBCb29zdCBvcGVyYXRvciB0ZW1wbGF0ZSwgeW91CisgICAgbXVzdCBzcGVjaWZ5IHRoZSBvcGVyYXRvciB0ZW1wbGF0ZSB3aXRoIHRoZSB0cmFpbGluZyA8Y29kZT4nMSc8L2NvZGU+IGluCisgICAgaXRzIG5hbWUuIE90aGVyd2lzZSB0aGUgbGlicmFyeSB3aWxsIGFzc3VtZSB5b3UgbWVhbiB0byBkZWZpbmUgYSBiaW5hcnkKKyAgICBvcGVyYXRpb24gY29tYmluaW5nIHRoZSBjbGFzcyB5b3UgaW50ZW5kIHRvIHVzZSBhcyBhIGJhc2UgY2xhc3MgYW5kIHRoZQorICAgIGNsYXNzIHlvdSdyZSBkZXJpdmluZy48L3A+CisKKyAgICA8aDM+U2VwYXJhdGUsIDxhIG5hbWU9ImV4cGxpY2l0X2luc3RhbnRpYXRpb24iPkV4cGxpY2l0CisgICAgSW5zdGFudGlhdGlvbjwvYT48L2gzPgorCisgICAgPHA+T24gc29tZSBjb21waWxlcnMgKDxpPmUuZy48L2k+IEJvcmxhbmQsIEdDQykgZXZlbiBzaW5nbGUtaW5oZXJpdGFuY2UKKyAgICBzZWVtcyB0byBjYXVzZSBhbiBpbmNyZWFzZSBpbiBvYmplY3Qgc2l6ZSBpbiBzb21lIGNhc2VzLiBJZiB5b3UgYXJlIG5vdAorICAgIGRlZmluaW5nIGEgY2xhc3MgdGVtcGxhdGUsIHlvdSBtYXkgZ2V0IGJldHRlciBvYmplY3Qtc2l6ZSBwZXJmb3JtYW5jZSBieQorICAgIGF2b2lkaW5nIGRlcml2YXRpb24gYWx0b2dldGhlciwgYW5kIGluc3RlYWQgZXhwbGljaXRseSBpbnN0YW50aWF0aW5nIHRoZQorICAgIG9wZXJhdG9yIHRlbXBsYXRlIGFzIGZvbGxvd3M6PC9wPgorCisgICAgPGJsb2NrcXVvdGU+Cis8cHJlPgorICAgIGNsYXNzIG15Y2xhc3MgLy8gbG9zZSB0aGUgaW5oZXJpdGFuY2UuLi4KKyAgICB7CisgICAgICAgIC8vLi4uCisgICAgfTsKKworICAgIC8vIGV4cGxpY2l0bHkgaW5zdGFudGlhdGUgdGhlIG9wZXJhdG9ycyBJIG5lZWQuCisgICAgdGVtcGxhdGUgc3RydWN0IGxlc3NfdGhhbl9jb21wYXJhYmxlJmx0O215Y2xhc3MmZ3Q7OworICAgIHRlbXBsYXRlIHN0cnVjdCBlcXVhbGl0eV9jb21wYXJhYmxlJmx0O215Y2xhc3MmZ3Q7OworICAgIHRlbXBsYXRlIHN0cnVjdCBpbmNyZW1lbnRhYmxlJmx0O215Y2xhc3MmZ3Q7OworICAgIHRlbXBsYXRlIHN0cnVjdCBkZWNyZW1lbnRhYmxlJmx0O215Y2xhc3MmZ3Q7OworICAgIHRlbXBsYXRlIHN0cnVjdCBhZGRhYmxlJmx0O215Y2xhc3MsbG9uZyZndDs7CisgICAgdGVtcGxhdGUgc3RydWN0IHN1YnRyYWN0YWJsZSZsdDtteWNsYXNzLGxvbmcmZ3Q7OworPC9wcmU+CisgICAgPC9ibG9ja3F1b3RlPgorCisgICAgPHA+Tm90ZSB0aGF0IHNvbWUgb3BlcmF0b3IgdGVtcGxhdGVzIGNhbm5vdCB1c2UgdGhpcyB3b3JrYXJvdW5kIGFuZCBtdXN0CisgICAgYmUgYSBiYXNlIGNsYXNzIG9mIHRoZWlyIHByaW1hcnkgb3BlcmFuZCB0eXBlLiBUaG9zZSB0ZW1wbGF0ZXMgZGVmaW5lCisgICAgb3BlcmF0b3JzIHdoaWNoIG11c3QgYmUgbWVtYmVyIGZ1bmN0aW9ucywgYW5kIHRoZSB3b3JrYXJvdW5kIG5lZWRzIHRoZQorICAgIG9wZXJhdG9ycyB0byBiZSBpbmRlcGVuZGVudCBmcmllbmQgZnVuY3Rpb25zLiBUaGUgcmVsZXZhbnQgdGVtcGxhdGVzCisgICAgYXJlOjwvcD4KKworICAgIDx1bD4KKyAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgIiNkZXJlZmVyZW5jZWFibGUiPmRlcmVmZXJlbmNlYWJsZSZsdDsmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2luZGV4YWJsZSI+aW5kZXhhYmxlJmx0OyZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgIDxsaT5BbnkgY29tcG9zaXRlIG9wZXJhdG9yIHRlbXBsYXRlIHRoYXQgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIG9mIHRoZQorICAgICAgYWJvdmU8L2xpPgorICAgIDwvdWw+CisKKyAgICA8cD5BcyBEYW5pZWwgS3ImdXVtbDtnbGVyIHBvaW50ZWQgb3V0LCB0aGlzIHRlY2huaXF1ZSB2aW9sYXRlcyAxNC42LjUvMgorICAgIGFuZCBpcyB0aHVzIG5vbi1wb3J0YWJsZS4gVGhlIHJlYXNvbmluZyBpcywgdGhhdCB0aGUgb3BlcmF0b3JzIGluamVjdGVkCisgICAgYnkgdGhlIGluc3RhbnRpYXRpb24gb2YgZS5nLgorICAgIDxjb2RlPmxlc3NfdGhhbl9jb21wYXJhYmxlJmx0O215Y2xhc3MmZ3Q7PC9jb2RlPiBjYW4gbm90IGJlIGZvdW5kCisgICAgYnkgQURMIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZ2l2ZW4gYnkgMy40LjIvMiwgc2luY2UgbXljbGFzcyBpcworICAgIG5vdCBhbiBhc3NvY2lhdGVkIGNsYXNzIG9mCisgICAgPGNvZGU+bGVzc190aGFuX2NvbXBhcmFibGUmbHQ7bXljbGFzcyZndDs8L2NvZGU+LgorICAgIFRodXMgb25seSB1c2UgdGhpcyB0ZWNobmlxdWUgaWYgYWxsIGVsc2UgZmFpbHMuPC9wPgorCisgICAgPGgzPlJlcXVpcmVtZW50IDxhIG5hbWU9InBvcnRhYmlsaXR5Ij5Qb3J0YWJpbGl0eTwvYT48L2gzPgorCisgICAgPHA+TWFueSBjb21waWxlcnMgKDxpPmUuZy48L2k+IE1TVkMgNi4zLCBHQ0MgMi45NS4yKSB3aWxsIG5vdCBlbmZvcmNlIHRoZQorICAgIHJlcXVpcmVtZW50cyBpbiB0aGUgb3BlcmF0b3IgdGVtcGxhdGUgdGFibGVzIHVubGVzcyB0aGUgb3BlcmF0aW9ucyB3aGljaAorICAgIGRlcGVuZCBvbiB0aGVtIGFyZSBhY3R1YWxseSB1c2VkLiBUaGlzIGlzIG5vdCBzdGFuZGFyZC1jb25mb3JtaW5nCisgICAgYmVoYXZpb3IuIEluIHBhcnRpY3VsYXIsIGFsdGhvdWdoIGl0IHdvdWxkIGJlIGNvbnZlbmllbnQgdG8gZGVyaXZlIGFsbAorICAgIHlvdXIgY2xhc3NlcyB3aGljaCBuZWVkIGJpbmFyeSBvcGVyYXRvcnMgZnJvbSB0aGUgPGNvZGU+PGEgaHJlZj0KKyAgICAiI29wZXJhdG9yczEiPm9wZXJhdG9ycyZsdDsmZ3Q7PC9hPjwvY29kZT4gYW5kIDxjb2RlPjxhIGhyZWY9CisgICAgIiNvcGVyYXRvcnMyIj5vcGVyYXRvcnMyJmx0OyZndDs8L2E+PC9jb2RlPiB0ZW1wbGF0ZXMsIHJlZ2FyZGxlc3Mgb2YKKyAgICB3aGV0aGVyIHRoZXkgaW1wbGVtZW50IGFsbCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRob3NlIHRlbXBsYXRlcywgdGhpcworICAgIHNob3J0Y3V0IGlzIG5vdCBwb3J0YWJsZS4gRXZlbiBpZiB0aGlzIGN1cnJlbnRseSB3b3JrcyB3aXRoIHlvdXIKKyAgICBjb21waWxlciwgaXQgbWF5IG5vdCB3b3JrIGxhdGVyLjwvcD4KKworICAgIDxoMj48YSBuYW1lPSJleGFtcGxlIj5FeGFtcGxlPC9hPjwvaDI+CisKKyAgICA8cD5UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHNvbWUgb2YgdGhlIDxhIGhyZWY9IiNhcml0aG1ldGljIj5hcml0aG1ldGljCisgICAgb3BlcmF0b3IgdGVtcGxhdGVzPC9hPiBjYW4gYmUgdXNlZCB3aXRoIGEgZ2VvbWV0cmljIHBvaW50IGNsYXNzCisgICAgKHRlbXBsYXRlKS48L3A+Cis8cHJlPgordGVtcGxhdGUgJmx0O2NsYXNzIFQmZ3Q7CitjbGFzcyBwb2ludCAgICAvLyBub3RlOiBwcml2YXRlIGluaGVyaXRhbmNlIGlzIE9LIGhlcmUhCisgICAgOiBib29zdDo6YWRkYWJsZSZsdDsgcG9pbnQmbHQ7VCZndDsgICAgICAgICAgLy8gcG9pbnQgKyBwb2ludAorICAgICwgYm9vc3Q6OnN1YnRyYWN0YWJsZSZsdDsgcG9pbnQmbHQ7VCZndDsgICAgIC8vIHBvaW50IC0gcG9pbnQKKyAgICAsIGJvb3N0OjpkaXZpZGFibGUyJmx0OyBwb2ludCZsdDtUJmd0OywgVCAgICAvLyBwb2ludCAvIFQKKyAgICAsIGJvb3N0OjptdWx0aXBsaWFibGUyJmx0OyBwb2ludCZsdDtUJmd0OywgVCAvLyBwb2ludCAqIFQsIFQgKiBwb2ludAorICAgICAgJmd0OyAmZ3Q7ICZndDsgJmd0OworeworcHVibGljOgorICAgIHBvaW50KFQsIFQpOworICAgIFQgeCgpIGNvbnN0OworICAgIFQgeSgpIGNvbnN0OworCisgICAgcG9pbnQgb3BlcmF0b3IrPShjb25zdCBwb2ludCZhbXA7KTsKKyAgICAvLyBwb2ludCBvcGVyYXRvcisocG9pbnQsIGNvbnN0IHBvaW50JmFtcDspIGF1dG9tYXRpY2FsbHkKKyAgICAvLyBnZW5lcmF0ZWQgYnkgYWRkYWJsZS4KKworICAgIHBvaW50IG9wZXJhdG9yLT0oY29uc3QgcG9pbnQmYW1wOyk7CisgICAgLy8gcG9pbnQgb3BlcmF0b3ItKHBvaW50LCBjb25zdCBwb2ludCZhbXA7KSBhdXRvbWF0aWNhbGx5CisgICAgLy8gZ2VuZXJhdGVkIGJ5IHN1YnRyYWN0YWJsZS4KKworICAgIHBvaW50IG9wZXJhdG9yKj0oVCk7CisgICAgLy8gcG9pbnQgb3BlcmF0b3IqKHBvaW50LCBjb25zdCBUJmFtcDspIGFuZAorICAgIC8vIHBvaW50IG9wZXJhdG9yKihjb25zdCBUJmFtcDssIHBvaW50KSBhdXRvLWdlbmVyYXRlZAorICAgIC8vIGJ5IG11bHRpcGxpYWJsZS4KKworICAgIHBvaW50IG9wZXJhdG9yLz0oVCk7CisgICAgLy8gcG9pbnQgb3BlcmF0b3IvKHBvaW50LCBjb25zdCBUJmFtcDspIGF1dG8tZ2VuZXJhdGVkCisgICAgLy8gYnkgZGl2aWRhYmxlLgorcHJpdmF0ZToKKyAgICBUIHhfOworICAgIFQgeV87Cit9OworCisvLyBub3cgdXNlIHRoZSBwb2ludCZsdDsmZ3Q7IGNsYXNzOgorCit0ZW1wbGF0ZSAmbHQ7Y2xhc3MgVCZndDsKK1QgbGVuZ3RoKGNvbnN0IHBvaW50Jmx0O1QmZ3Q7IHApCit7CisgICAgcmV0dXJuIHNxcnQocC54KCkqcC54KCkgKyBwLnkoKSpwLnkoKSk7Cit9CisKK2NvbnN0IHBvaW50Jmx0O2Zsb2F0Jmd0OyByaWdodCgwLCAxKTsKK2NvbnN0IHBvaW50Jmx0O2Zsb2F0Jmd0OyB1cCgxLCAwKTsKK2NvbnN0IHBvaW50Jmx0O2Zsb2F0Jmd0OyBwaV9vdmVyXzQgPSB1cCArIHJpZ2h0OworY29uc3QgcG9pbnQmbHQ7ZmxvYXQmZ3Q7IHBpX292ZXJfNF9ub3JtYWxpemVkID0gcGlfb3Zlcl80IC8gbGVuZ3RoKHBpX292ZXJfNCk7Cis8L3ByZT4KKworICAgIDxoMj48YSBuYW1lPSJhcml0aG1ldGljIj5Bcml0aG1ldGljPC9hPiBPcGVyYXRvcnM8L2gyPgorCisgICAgPHA+VGhlIGFyaXRobWV0aWMgb3BlcmF0b3IgdGVtcGxhdGVzIGVhc2UgdGhlIHRhc2sgb2YgY3JlYXRpbmcgYSBjdXN0b20KKyAgICBudW1lcmljIHR5cGUuIEdpdmVuIGEgY29yZSBzZXQgb2Ygb3BlcmF0b3JzLCB0aGUgdGVtcGxhdGVzIGFkZCByZWxhdGVkCisgICAgb3BlcmF0b3JzIHRvIHRoZSBudW1lcmljIGNsYXNzLiBUaGVzZSBvcGVyYXRpb25zIGFyZSBsaWtlIHRoZSBvbmVzIHRoZQorICAgIHN0YW5kYXJkIGFyaXRobWV0aWMgdHlwZXMgaGF2ZSwgYW5kIG1heSBpbmNsdWRlIGNvbXBhcmlzb25zLCBhZGRpbmcsCisgICAgaW5jcmVtZW50aW5nLCBsb2dpY2FsIGFuZCBiaXR3aXNlIG1hbmlwdWxhdGlvbnMsIDxpPmV0YzwvaT4uIEZ1cnRoZXIsCisgICAgc2luY2UgbW9zdCBudW1lcmljIHR5cGVzIG5lZWQgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSBvcGVyYXRvcnMsIHNvbWUKKyAgICB0ZW1wbGF0ZXMgYXJlIHByb3ZpZGVkIHRvIGNvbWJpbmUgc2V2ZXJhbCBvZiB0aGUgYmFzaWMgb3BlcmF0b3IgdGVtcGxhdGVzCisgICAgaW4gb25lIGRlY2xhcmF0aW9uLjwvcD4KKworICAgIDxwPlRoZSByZXF1aXJlbWVudHMgZm9yIHRoZSB0eXBlcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBzaW1wbGUgb3BlcmF0b3IKKyAgICB0ZW1wbGF0ZXMgYXJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBleHByZXNzaW9ucyB3aGljaCBtdXN0IGJlIHZhbGlkIGFuZAorICAgIHRoZSBleHByZXNzaW9uJ3MgcmV0dXJuIHR5cGUuIFRoZSBjb21wb3NpdGUgb3BlcmF0b3IgdGVtcGxhdGVzIG9ubHkgbGlzdAorICAgIHdoYXQgb3RoZXIgdGVtcGxhdGVzIHRoZXkgdXNlLiBUaGUgc3VwcGxpZWQgb3BlcmF0aW9ucyBhbmQgcmVxdWlyZW1lbnRzCisgICAgb2YgdGhlIGNvbXBvc2l0ZSBvcGVyYXRvciB0ZW1wbGF0ZXMgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIG9wZXJhdGlvbnMKKyAgICBhbmQgcmVxdWlyZW1lbnRzIG9mIHRoZSBsaXN0ZWQgY29tcG9uZW50cy48L3A+CisKKyAgICA8aDM+PGEgbmFtZT0ic21wbF9vcHJzIj5TaW1wbGUgQXJpdGhtZXRpYyBPcGVyYXRvcnM8L2E+PC9oMz4KKworICAgIDxwPlRoZXNlIHRlbXBsYXRlcyBhcmUgInNpbXBsZSIgc2luY2UgdGhleSBwcm92aWRlIG9wZXJhdG9ycyBiYXNlZCBvbiBhCisgICAgc2luZ2xlIG9wZXJhdGlvbiB0aGUgYmFzZSB0eXBlIGhhcyB0byBwcm92aWRlLiBUaGV5IGhhdmUgYW4gYWRkaXRpb25hbAorICAgIG9wdGlvbmFsIHRlbXBsYXRlIHBhcmFtZXRlciA8Y29kZT5CPC9jb2RlPiwgd2hpY2ggaXMgbm90IHNob3duLCBmb3IgdGhlCisgICAgPGEgaHJlZj0iI2NoYWluaW5nIj5iYXNlIGNsYXNzIGNoYWluaW5nPC9hPiB0ZWNobmlxdWUuPC9wPgorCisgICAgPHA+VGhlIHByaW1hcnkgb3BlcmFuZCB0eXBlIDxjb2RlPlQ8L2NvZGU+IG5lZWRzIHRvIGJlIG9mIGNsYXNzIHR5cGUsCisgICAgYnVpbHQtaW4gdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQuPC9wPgorCisgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjEiIGFsaWduPSJjZW50ZXIiPgorICAgICAgPGNhcHRpb24+CisgICAgICAgIFNpbXBsZSBBcml0aG1ldGljIE9wZXJhdG9yIFRlbXBsYXRlIENsYXNzZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBwcmltYXJ5IG9wZXJhbmQgdHlwZTwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlU8L2NvZGU+OiBhbHRlcm5hdGUgb3BlcmFuZCB0eXBlPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPnQ8L2NvZGU+LCA8Y29kZT50MTwvY29kZT46IHZhbHVlcyBvZiB0eXBlCisgICAgICAgICAgICAgIDxjb2RlPlQ8L2NvZGU+PC90ZD4KKworICAgICAgICAgICAgICA8dGQ+PGNvZGU+dTwvY29kZT46IHZhbHVlIG9mIHR5cGUgPGNvZGU+VTwvY29kZT48L3RkPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICA8L3RhYmxlPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGg+VGVtcGxhdGU8L3RoPgorCisgICAgICAgIDx0aD5TdXBwbGllZCBPcGVyYXRpb25zPC90aD4KKworICAgICAgICA8dGg+UmVxdWlyZW1lbnRzPC90aD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJsZXNzX3RoYW5fY29tcGFyYWJsZTEiPmxlc3NfdGhhbl9jb21wYXJhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5sZXNzX3RoYW5fY29tcGFyYWJsZTEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+Ym9vbCBvcGVyYXRvciZndDsoY29uc3QgVCZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJvb2wgb3BlcmF0b3ImbHQ7PShjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZndDs9KGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT50ICZsdDsgdDE8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5ib29sPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI29yZGVyaW5nIj5PcmRlcmluZyBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ibGVzc190aGFuX2NvbXBhcmFibGUyIj5sZXNzX3RoYW5fY29tcGFyYWJsZSZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+bGVzc190aGFuX2NvbXBhcmFibGUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPmJvb2wgb3BlcmF0b3ImbHQ7PShjb25zdCBUJmFtcDssIGNvbnN0IFUmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZndDs9KGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5ib29sIG9wZXJhdG9yJmd0Oyhjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZsdDsoY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJvb2wgb3BlcmF0b3ImbHQ7PShjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZndDs9KGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT50ICZsdDsgdTwvY29kZT4uIDxjb2RlPnQgJmd0OyB1PC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm5zIGNvbnZlcnRpYmxlIHRvIDxjb2RlPmJvb2w8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjb3JkZXJpbmciPk9yZGVyaW5nIE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAiZXF1YWxpdHlfY29tcGFyYWJsZTEiPmVxdWFsaXR5X2NvbXBhcmFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmVxdWFsaXR5X2NvbXBhcmFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPmJvb2wgb3BlcmF0b3IhPShjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+dCA9PSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPmJvb2w8L2NvZGU+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJlcXVhbGl0eV9jb21wYXJhYmxlMiI+ZXF1YWxpdHlfY29tcGFyYWJsZSZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+ZXF1YWxpdHlfY29tcGFyYWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+Ym9vbCBvcGVyYXRvcj09KGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5ib29sIG9wZXJhdG9yIT0oY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJvb2wgb3BlcmF0b3IhPShjb25zdCBUJmFtcDssIGNvbnN0IFUmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+dCA9PSB1PC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+Ym9vbDwvY29kZT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImFkZGFibGUxIj5hZGRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5hZGRhYmxlMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yKyhjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHQpOyB0ZW1wICs9IHQxPC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNzeW1tZXRyeSI+U3ltbWV0cnkgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImFkZGFibGUyIj5hZGRhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5hZGRhYmxlMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yKyhjb25zdCBUJmFtcDssIGNvbnN0IFUmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+VCBvcGVyYXRvcisoY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDsgKTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgKz0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAic3VidHJhY3RhYmxlMSI+c3VidHJhY3RhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5zdWJ0cmFjdGFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3ItKGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgLT0gdDE8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ic3VidHJhY3RhYmxlMiI+c3VidHJhY3RhYmxlJmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5zdWJ0cmFjdGFibGUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3ItKGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgLT0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJzdWJ0cmFjdGFibGUyX2xlZnQiPnN1YnRyYWN0YWJsZTJfbGVmdCZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvci0oY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh1KTsgdGVtcCAtPSB0PC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJtdWx0aXBsaWFibGUxIj5tdWx0aXBsaWFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm11bHRpcGxpYWJsZTEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvciooY29uc3QgVCZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCAqPSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJtdWx0aXBsaWFibGUyIj5tdWx0aXBsaWFibGUmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm11bHRpcGxpYWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvciooY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPlQgb3BlcmF0b3IqKGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgKj0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJkaXZpZGFibGUxIj5kaXZpZGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmRpdmlkYWJsZTEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvci8oY29uc3QgVCZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCAvPSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJkaXZpZGFibGUyIj5kaXZpZGFibGUmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmRpdmlkYWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvci8oY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCAvPSB1PC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNzeW1tZXRyeSI+U3ltbWV0cnkgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImRpdmlkYWJsZTJfbGVmdCI+ZGl2aWRhYmxlMl9sZWZ0Jmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yLyhjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHUpOyB0ZW1wIC89IHQ8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ibW9kYWJsZTEiPm1vZGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm1vZGFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3IlKGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgJT0gdDE8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ibW9kYWJsZTIiPm1vZGFibGUmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm1vZGFibGUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3IlKGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgJT0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJtb2RhYmxlMl9sZWZ0Ij5tb2RhYmxlMl9sZWZ0Jmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yJShjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHUpOyB0ZW1wICU9IHQ8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ib3JhYmxlMSI+b3JhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5vcmFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3J8KGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgfD0gdDE8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ib3JhYmxlMiI+b3JhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5vcmFibGUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3J8KGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5UIG9wZXJhdG9yfChjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHQpOyB0ZW1wIHw9IHU8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iYW5kYWJsZTEiPmFuZGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmFuZGFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3ImYW1wOyhjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHQpOyB0ZW1wICZhbXA7PSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJhbmRhYmxlMiI+YW5kYWJsZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+YW5kYWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvciZhbXA7KGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5UIG9wZXJhdG9yJmFtcDsoY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCAmYW1wOz0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJ4b3JhYmxlMSI+eG9yYWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+eG9yYWJsZTEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvcl4oY29uc3QgVCZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCBePSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJ4b3JhYmxlMiI+eG9yYWJsZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+eG9yYWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvcl4oY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPlQgb3BlcmF0b3JeKGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgXj0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAiaW5jcmVtZW50YWJsZSI+aW5jcmVtZW50YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvcisrKFQmYW1wOywgaW50KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7ICsrdDwvY29kZT48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJkZWNyZW1lbnRhYmxlIj5kZWNyZW1lbnRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yLS0oVCZhbXA7LCBpbnQpPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgLS10OzwvY29kZT48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJsZWZ0X3NoaWZ0YWJsZTEiPmxlZnRfc2hpZnRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5sZWZ0X3NoaWZ0YWJsZTEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvciZsdDsmbHQ7KGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgJmx0OyZsdDs9IHQxPC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+VDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNzeW1tZXRyeSI+U3ltbWV0cnkgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImxlZnRfc2hpZnRhYmxlMiI+bGVmdF9zaGlmdGFibGUmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmxlZnRfc2hpZnRhYmxlMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIG9wZXJhdG9yJmx0OyZsdDsoY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgdGVtcCh0KTsgdGVtcCAmbHQ7Jmx0Oz0gdTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAicmlnaHRfc2hpZnRhYmxlMSI+cmlnaHRfc2hpZnRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5yaWdodF9zaGlmdGFibGUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlQgb3BlcmF0b3ImZ3Q7Jmd0Oyhjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCB0ZW1wKHQpOyB0ZW1wICZndDsmZ3Q7PSB0MTwvY29kZT4uPGJyPgorICAgICAgICAgUmV0dXJuIGNvbnZlcnRpYmxlIHRvIDxjb2RlPlQ8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjc3ltbWV0cnkiPlN5bW1ldHJ5IE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJyaWdodF9zaGlmdGFibGUyIj5yaWdodF9zaGlmdGFibGUmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPnJpZ2h0X3NoaWZ0YWJsZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+VCBvcGVyYXRvciZndDsmZ3Q7KGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5UIHRlbXAodCk7IHRlbXAgJmd0OyZndDs9IHU8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5UPC9jb2RlPi4gU2VlIHRoZSA8YSBocmVmPQorICAgICAgICAiI3N5bW1ldHJ5Ij5TeW1tZXRyeSBOb3RlPC9hPi48L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iZXF1aXZhbGVudDEiPmVxdWl2YWxlbnQmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmVxdWl2YWxlbnQxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPmJvb2wgb3BlcmF0b3I9PShjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+dCAmbHQ7IHQxPC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm4gY29udmVydGlibGUgdG8gPGNvZGU+Ym9vbDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNvcmRlcmluZyI+T3JkZXJpbmcgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImVxdWl2YWxlbnQyIj5lcXVpdmFsZW50Jmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5lcXVpdmFsZW50MiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5ib29sIG9wZXJhdG9yPT0oY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPnQgJmx0OyB1PC9jb2RlPi4gPGNvZGU+dCAmZ3Q7IHU8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybnMgY29udmVydGlibGUgdG8gPGNvZGU+Ym9vbDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNvcmRlcmluZyI+T3JkZXJpbmcgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJwYXJ0aWFsbHlfb3JkZXJlZDEiPnBhcnRpYWxseV9vcmRlcmVkJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5wYXJ0aWFsbHlfb3JkZXJlZDEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+Ym9vbCBvcGVyYXRvciZndDsoY29uc3QgVCZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJvb2wgb3BlcmF0b3ImbHQ7PShjb25zdCBUJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZndDs9KGNvbnN0IFQmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT50ICZsdDsgdDE8L2NvZGU+LiA8Y29kZT50ID09IHQxPC9jb2RlPi48YnI+CisgICAgICAgICBSZXR1cm5zIGNvbnZlcnRpYmxlIHRvIDxjb2RlPmJvb2w8L2NvZGU+LiBTZWUgdGhlIDxhIGhyZWY9CisgICAgICAgICIjb3JkZXJpbmciPk9yZGVyaW5nIE5vdGU8L2E+LjwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJwYXJ0aWFsbHlfb3JkZXJlZDIiPnBhcnRpYWxseV9vcmRlcmVkJmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5wYXJ0aWFsbHlfb3JkZXJlZDImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+PGNvZGU+Ym9vbCBvcGVyYXRvciZsdDs9KGNvbnN0IFQmYW1wOywgY29uc3QgVSZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5ib29sIG9wZXJhdG9yJmd0Oz0oY29uc3QgVCZhbXA7LCBjb25zdCBVJmFtcDspPC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJvb2wgb3BlcmF0b3ImZ3Q7KGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5ib29sIG9wZXJhdG9yJmx0Oyhjb25zdCBVJmFtcDssIGNvbnN0IFQmYW1wOyk8L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+Ym9vbCBvcGVyYXRvciZsdDs9KGNvbnN0IFUmYW1wOywgY29uc3QgVCZhbXA7KTwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5ib29sIG9wZXJhdG9yJmd0Oz0oY29uc3QgVSZhbXA7LCBjb25zdCBUJmFtcDspPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPnQgJmx0OyB1PC9jb2RlPi4gPGNvZGU+dCAmZ3Q7IHU8L2NvZGU+LiA8Y29kZT50ID09CisgICAgICAgIHU8L2NvZGU+Ljxicj4KKyAgICAgICAgIFJldHVybnMgY29udmVydGlibGUgdG8gPGNvZGU+Ym9vbDwvY29kZT4uIFNlZSB0aGUgPGEgaHJlZj0KKyAgICAgICAgIiNvcmRlcmluZyI+T3JkZXJpbmcgTm90ZTwvYT4uPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDxoND48YSBuYW1lPSJvcmRlcmluZyI+T3JkZXJpbmc8L2E+IE5vdGU8L2g0PgorCisgICAgPHA+VGhlIDxjb2RlPjxhIGhyZWY9CisgICAgIiNsZXNzX3RoYW5fY29tcGFyYWJsZTEiPmxlc3NfdGhhbl9jb21wYXJhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT4gYW5kCisgICAgPGNvZGU+PGEgaHJlZj0iI3BhcnRpYWxseV9vcmRlcmVkMSI+cGFydGlhbGx5X29yZGVyZWQmbHQ7VCZndDs8L2E+PC9jb2RlPgorICAgIHRlbXBsYXRlcyBwcm92aWRlIHRoZSBzYW1lIHNldCBvZiBvcGVyYXRpb25zLiBIb3dldmVyLCB0aGUgd29ya2luZ3Mgb2YKKyAgICA8Y29kZT48YSBocmVmPQorICAgICIjbGVzc190aGFuX2NvbXBhcmFibGUxIj5sZXNzX3RoYW5fY29tcGFyYWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+IGFzc3VtZQorICAgIHRoYXQgYWxsIHZhbHVlcyBvZiB0eXBlIDxjb2RlPlQ8L2NvZGU+IGNhbiBiZSBwbGFjZWQgaW4gYSB0b3RhbCBvcmRlci4gSWYKKyAgICB0aGF0IGlzIG5vdCB0cnVlICg8aT5lLmcuPC9pPiBOb3QtYS1OdW1iZXIgdmFsdWVzIGluIElFRUUgZmxvYXRpbmcgcG9pbnQKKyAgICBhcml0aG1ldGljKSwgdGhlbiA8Y29kZT48YSBocmVmPQorICAgICIjcGFydGlhbGx5X29yZGVyZWQxIj5wYXJ0aWFsbHlfb3JkZXJlZCZsdDtUJmd0OzwvYT48L2NvZGU+IHNob3VsZCBiZQorICAgIHVzZWQuIFRoZSA8Y29kZT48YSBocmVmPQorICAgICIjcGFydGlhbGx5X29yZGVyZWQxIj5wYXJ0aWFsbHlfb3JkZXJlZCZsdDtUJmd0OzwvYT48L2NvZGU+IHRlbXBsYXRlIGNhbgorICAgIGJlIHVzZWQgZm9yIGEgdG90YWxseS1vcmRlcmVkIHR5cGUsIGJ1dCBpdCBpcyBub3QgYXMgZWZmaWNpZW50IGFzCisgICAgPGNvZGU+PGEgaHJlZj0KKyAgICAiI2xlc3NfdGhhbl9jb21wYXJhYmxlMSI+bGVzc190aGFuX2NvbXBhcmFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPi4gVGhpcworICAgIHJ1bGUgYWxzbyBhcHBsaWVzIGZvciA8Y29kZT48YSBocmVmPQorICAgICIjbGVzc190aGFuX2NvbXBhcmFibGUyIj5sZXNzX3RoYW5fY29tcGFyYWJsZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+IGFuZAorICAgIDxjb2RlPjxhIGhyZWY9IiNwYXJ0aWFsbHlfb3JkZXJlZDIiPnBhcnRpYWxseV9vcmRlcmVkJmx0O1QsCisgICAgVSZndDs8L2E+PC9jb2RlPiB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yZGVyaW5nIG9mIGFsbCA8Y29kZT5UPC9jb2RlPiBhbmQKKyAgICA8Y29kZT5VPC9jb2RlPiB2YWx1ZXMsIGFuZCBmb3IgYm90aCB2ZXJzaW9ucyBvZiA8Y29kZT48YSBocmVmPQorICAgICIjZXF1aXZhbGVudDEiPmVxdWl2YWxlbnQmbHQ7Jmd0OzwvYT48L2NvZGU+LiBUaGUgc29sdXRpb24gZm9yIDxjb2RlPjxhCisgICAgaHJlZj0iI2VxdWl2YWxlbnQxIj5lcXVpdmFsZW50Jmx0OyZndDs8L2E+PC9jb2RlPiBpcyB0byB3cml0ZSBhIGN1c3RvbQorICAgIDxjb2RlPm9wZXJhdG9yPT08L2NvZGU+IGZvciB0aGUgdGFyZ2V0IGNsYXNzLjwvcD4KKworICAgIDxoND48YSBuYW1lPSJzeW1tZXRyeSI+U3ltbWV0cnk8L2E+IE5vdGU8L2g0PgorCisgICAgPHA+QmVmb3JlIHRhbGtpbmcgYWJvdXQgc3ltbWV0cnksIHdlIG5lZWQgdG8gdGFsayBhYm91dCBvcHRpbWl6YXRpb25zIHRvCisgICAgdW5kZXJzdGFuZCB0aGUgcmVhc29ucyBmb3IgdGhlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBzdHlsZXMgb2YKKyAgICBvcGVyYXRvcnMuIExldCdzIGhhdmUgYSBsb29rIGF0IDxjb2RlPm9wZXJhdG9yKzwvY29kZT4gZm9yIGEgY2xhc3MKKyAgICA8Y29kZT5UPC9jb2RlPiBhcyBhbiBleGFtcGxlOjwvcD4KKzxwcmU+CitUIG9wZXJhdG9yKyggY29uc3QgVCZhbXA7IGxocywgY29uc3QgVCZhbXA7IHJocyApCit7CisgICByZXR1cm4gVCggbGhzICkgKz0gcmhzOworfQorPC9wcmU+CisgICAgVGhpcyB3b3VsZCBiZSBhIG5vcm1hbCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5vcGVyYXRvcis8L2NvZGU+LCBidXQgaXQKKyAgICBpcyBub3QgYW4gZWZmaWNpZW50IG9uZS4gQW4gdW5uYW1lZCBsb2NhbCBjb3B5IG9mIDxjb2RlPmxoczwvY29kZT4gaXMKKyAgICBjcmVhdGVkLCA8Y29kZT5vcGVyYXRvcis9PC9jb2RlPiBpcyBjYWxsZWQgb24gaXQgYW5kIGl0IGlzIGNvcGllZCB0byB0aGUKKyAgICBmdW5jdGlvbiByZXR1cm4gdmFsdWUgKHdoaWNoIGlzIGFub3RoZXIgdW5uYW1lZCBvYmplY3Qgb2YgdHlwZQorICAgIDxjb2RlPlQ8L2NvZGU+KS4gVGhlIHN0YW5kYXJkIGRvZXNuJ3QgZ2VuZXJhbGx5IGFsbG93IHRoZSBpbnRlcm1lZGlhdGUKKyAgICBvYmplY3QgdG8gYmUgb3B0aW1pemVkIGF3YXk6CisKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDMuNy4yLzI6IEF1dG9tYXRpYyBzdG9yYWdlIGR1cmF0aW9uPGJyPgorICAgICAgPGJyPgorICAgICAgIElmIGEgbmFtZWQgYXV0b21hdGljIG9iamVjdCBoYXMgaW5pdGlhbGl6YXRpb24gb3IgYSBkZXN0cnVjdG9yIHdpdGgKKyAgICAgIHNpZGUgZWZmZWN0cywgaXQgc2hhbGwgbm90IGJlIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGVuZCBvZiBpdHMgYmxvY2ssCisgICAgICBub3Igc2hhbGwgaXQgYmUgZWxpbWluYXRlZCBhcyBhbiBvcHRpbWl6YXRpb24gZXZlbiBpZiBpdCBhcHBlYXJzIHRvIGJlCisgICAgICB1bnVzZWQsIGV4Y2VwdCB0aGF0IGEgY2xhc3Mgb2JqZWN0IG9yIGl0cyBjb3B5IG1heSBiZSBlbGltaW5hdGVkIGFzCisgICAgICBzcGVjaWZpZWQgaW4gMTIuOC4KKyAgICA8L2Jsb2NrcXVvdGU+CisgICAgVGhlIHJlZmVyZW5jZSB0byAxMi44IGlzIGltcG9ydGFudCBmb3IgdXM6CisKKyAgICA8YmxvY2txdW90ZT4KKyAgICAgIDEyLjgvMTU6IENvcHlpbmcgY2xhc3Mgb2JqZWN0czxicj4KKyAgICAgICAuLi48YnI+CisgICAgICAgRm9yIGEgZnVuY3Rpb24gd2l0aCBhIGNsYXNzIHJldHVybiB0eXBlLCBpZiB0aGUgZXhwcmVzc2lvbiBpbiB0aGUKKyAgICAgIHJldHVybiBzdGF0ZW1lbnQgaXMgdGhlIG5hbWUgb2YgYSBsb2NhbCBvYmplY3QsIGFuZCB0aGUgY3YtdW5xdWFsaWZpZWQKKyAgICAgIHR5cGUgb2YgdGhlIGxvY2FsIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgZnVuY3Rpb24gcmV0dXJuIHR5cGUsIGFuCisgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBwZXJtaXR0ZWQgdG8gb21pdCBjcmVhdGluZyB0aGUgdGVtcG9yYXJ5IG9iamVjdCB0bworICAgICAgaG9sZCB0aGUgZnVuY3Rpb24gcmV0dXJuIHZhbHVlLCBldmVuIGlmIHRoZSBjbGFzcyBjb3B5IGNvbnN0cnVjdG9yIG9yCisgICAgICBkZXN0cnVjdG9yIGhhcyBzaWRlIGVmZmVjdHMuCisgICAgPC9ibG9ja3F1b3RlPgorICAgIFRoaXMgb3B0aW1pemF0aW9uIGlzIGtub3duIGFzIHRoZSBuYW1lZCByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uIChOUlZPKSwKKyAgICB3aGljaCBsZWFkcyB1cyB0byB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGZvcgorICAgIDxjb2RlPm9wZXJhdG9yKzwvY29kZT46Cis8cHJlPgorVCBvcGVyYXRvcisoIGNvbnN0IFQmYW1wOyBsaHMsIGNvbnN0IFQmYW1wOyByaHMgKQoreworICAgVCBucnYoIGxocyApOworICAgbnJ2ICs9IHJoczsKKyAgIHJldHVybiBucnY7Cit9Cis8L3ByZT4KKyAgICBHaXZlbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgY29tcGlsZXIgaXMgYWxsb3dlZCB0byByZW1vdmUgdGhlCisgICAgaW50ZXJtZWRpYXRlIG9iamVjdC4gU2FkbHksIG5vdCBhbGwgY29tcGlsZXIgaW1wbGVtZW50IHRoZSBOUlZPLCBzb21lCisgICAgZXZlbiBpbXBsZW1lbnQgaXQgaW4gYW4gaW5jb3JyZWN0IHdheSB3aGljaCBtYWtlcyBpdCB1c2VsZXNzIGhlcmUuCisgICAgV2l0aG91dCB0aGUgTlJWTywgdGhlIE5SVk8tZnJpZW5kbHkgY29kZSBpcyBubyB3b3JzZSB0aGFuIHRoZSBvcmlnaW5hbAorICAgIGNvZGUgc2hvd2VkIGFib3ZlLCBidXQgdGhlcmUgaXMgYW5vdGhlciBwb3NzaWJsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKyAgICBoYXMgc29tZSB2ZXJ5IHNwZWNpYWwgcHJvcGVydGllczoKKzxwcmU+CitUIG9wZXJhdG9yKyggVCBsaHMsIGNvbnN0IFQmYW1wOyByaHMgKQoreworICAgcmV0dXJuIGxocyArPSByaHM7Cit9Cis8L3ByZT4KKyAgICBUaGUgZGlmZmVyZW5jZSB0byB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24gaXMgdGhhdCA8Y29kZT5saHM8L2NvZGU+IGlzCisgICAgbm90IHRha2VuIGFzIGEgY29uc3RhbnQgcmVmZXJlbmNlIHVzZWQgdG8gY3JlYXRlIGEgY29weTsgaW5zdGVhZCwKKyAgICA8Y29kZT5saHM8L2NvZGU+IGlzIGEgYnktdmFsdWUgcGFyYW1ldGVyLCB0aHVzIGl0IGlzIGFscmVhZHkgdGhlIGNvcHkKKyAgICBuZWVkZWQuIFRoaXMgYWxsb3dzIGFub3RoZXIgb3B0aW1pemF0aW9uICgxMi4yLzIpIGZvciBzb21lIGNhc2VzLgorICAgIENvbnNpZGVyIDxjb2RlPmEmbmJzcDsrJm5ic3A7YiZuYnNwOysmbmJzcDtjPC9jb2RlPiB3aGVyZSB0aGUgcmVzdWx0IG9mCisgICAgPGNvZGU+YSZuYnNwOysmbmJzcDtiPC9jb2RlPiBpcyBub3QgY29waWVkIHdoZW4gdXNlZCBhcyA8Y29kZT5saHM8L2NvZGU+CisgICAgd2hlbiBhZGRpbmcgPGNvZGU+YzwvY29kZT4uIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb3JpZ2luYWwKKyAgICBjb2RlLCBidXQgbm90IGFzIGVmZmljaWVudCBhcyBhIGNvbXBpbGVyIHVzaW5nIHRoZSBOUlZPLiBGb3IgbW9zdCBwZW9wbGUsCisgICAgaXQgaXMgc3RpbGwgcHJlZmVyYWJsZSBmb3IgY29tcGlsZXJzIHRoYXQgZG9uJ3QgaW1wbGVtZW50IHRoZSBOUlZPLCBidXQKKyAgICB0aGUgPGNvZGU+b3BlcmF0b3IrPC9jb2RlPiBub3cgaGFzIGEgZGlmZmVyZW50IGZ1bmN0aW9uIHNpZ25hdHVyZS4gQWxzbywKKyAgICB0aGUgbnVtYmVyIG9mIG9iamVjdHMgY3JlYXRlZCBkaWZmZXJzIGZvcgorICAgIDxjb2RlPihhJm5ic3A7KyZuYnNwO2ImbmJzcDspJm5ic3A7KyZuYnNwO2M8L2NvZGU+IGFuZAorICAgIDxjb2RlPmEmbmJzcDsrJm5ic3A7KCZuYnNwO2ImbmJzcDsrJm5ic3A7YyZuYnNwOyk8L2NvZGU+LiBNb3N0IHByb2JhYmx5LAorICAgIHRoaXMgd29uJ3QgYmUgYSBwcm9ibGVtIGZvciB5b3UsIGJ1dCBpZiB5b3VyIGNvZGUgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbgorICAgIHNpZ25hdHVyZSBvciBhIHN0cmljdCBzeW1tZXRyaWMgYmVoYXZpb3VyLCB5b3Ugc2hvdWxkIHNldAorICAgIDxjb2RlPkJPT1NUX0ZPUkNFX1NZTU1FVFJJQ19PUEVSQVRPUlM8L2NvZGU+IGluIHlvdXIgdXNlci1jb25maWcuIFRoaXMKKyAgICB3aWxsIGZvcmNlIHRoZSBOUlZPLWZyaWVuZGx5IGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgZXZlbiBmb3IgY29tcGlsZXJzCisgICAgdGhhdCBkb24ndCBpbXBsZW1lbnQgdGhlIE5SVk8uIDxicj4KKyAgICAgPGJyPgorCisgICAgPGgzPjxhIG5hbWU9ImdycGRfb3BycyI+R3JvdXBlZCBBcml0aG1ldGljIE9wZXJhdG9yczwvYT48L2gzPgorCisgICAgPHA+VGhlIGZvbGxvd2luZyB0ZW1wbGF0ZXMgcHJvdmlkZSBjb21tb24gZ3JvdXBzIG9mIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAgICBGb3IgZXhhbXBsZSwgc2luY2UgYSB0eXBlIHdoaWNoIGlzIGFkZGFibGUgaXMgdXN1YWxseSBhbHNvIHN1YnJhY3RhYmxlLAorICAgIHRoZSA8Y29kZT48YSBocmVmPSIjYWRkaXRpdmUxIj5hZGRpdGl2ZTwvYT48L2NvZGU+IHRlbXBsYXRlIHByb3ZpZGVzIHRoZQorICAgIGNvbWJpbmVkIG9wZXJhdG9ycyBvZiBib3RoLiBUaGUgZ3JvdXBlZCBvcGVyYXRvciB0ZW1wbGF0ZXMgaGF2ZSBhbgorICAgIGFkZGl0aW9uYWwgb3B0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyIDxjb2RlPkI8L2NvZGU+LCB3aGljaCBpcyBub3QKKyAgICBzaG93biwgZm9yIHRoZSA8YSBocmVmPSIjY2hhaW5pbmciPmJhc2UgY2xhc3MgY2hhaW5pbmc8L2E+IHRlY2huaXF1ZS48L3A+CisKKyAgICA8dGFibGUgY2VsbHBhZGRpbmc9IjUiIGJvcmRlcj0iMSIgYWxpZ249ImNlbnRlciI+CisgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgR3JvdXBlZCBBcml0aG1ldGljIE9wZXJhdG9yIFRlbXBsYXRlIENsYXNzZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBwcmltYXJ5IG9wZXJhbmQgdHlwZTwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlU8L2NvZGU+OiBhbHRlcm5hdGUgb3BlcmFuZCB0eXBlPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPlRlbXBsYXRlPC90aD4KKworICAgICAgICA8dGg+Q29tcG9uZW50IE9wZXJhdG9yIFRlbXBsYXRlczwvdGg+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAidG90YWxseV9vcmRlcmVkMSI+dG90YWxseV9vcmRlcmVkJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT50b3RhbGx5X29yZGVyZWQxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNsZXNzX3RoYW5fY29tcGFyYWJsZTEiPmxlc3NfdGhhbl9jb21wYXJhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjZXF1YWxpdHlfY29tcGFyYWJsZTEiPmVxdWFsaXR5X2NvbXBhcmFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9InRvdGFsbHlfb3JkZXJlZDIiPnRvdGFsbHlfb3JkZXJlZCZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+dG90YWxseV9vcmRlcmVkMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjbGVzc190aGFuX2NvbXBhcmFibGUyIj5sZXNzX3RoYW5fY29tcGFyYWJsZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNlcXVhbGl0eV9jb21wYXJhYmxlMiI+ZXF1YWxpdHlfY29tcGFyYWJsZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImFkZGl0aXZlMSI+YWRkaXRpdmUmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmFkZGl0aXZlMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FkZGFibGUxIj5hZGRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjc3VidHJhY3RhYmxlMSI+c3VidHJhY3RhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJhZGRpdGl2ZTIiPmFkZGl0aXZlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5hZGRpdGl2ZTImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNhZGRhYmxlMiI+YWRkYWJsZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNzdWJ0cmFjdGFibGUyIj5zdWJ0cmFjdGFibGUmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAibXVsdGlwbGljYXRpdmUxIj5tdWx0aXBsaWNhdGl2ZSZsdDtUJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+bXVsdGlwbGljYXRpdmUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNtdWx0aXBsaWFibGUxIj5tdWx0aXBsaWFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNkaXZpZGFibGUxIj5kaXZpZGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9Im11bHRpcGxpY2F0aXZlMiI+bXVsdGlwbGljYXRpdmUmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm11bHRpcGxpY2F0aXZlMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI211bHRpcGxpYWJsZTIiPm11bHRpcGxpYWJsZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjZGl2aWRhYmxlMiI+ZGl2aWRhYmxlJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgImludGVnZXJfbXVsdGlwbGljYXRpdmUxIj5pbnRlZ2VyX211bHRpcGxpY2F0aXZlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisKKyAgICAgICAgIDxjb2RlPmludGVnZXJfbXVsdGlwbGljYXRpdmUxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNtdWx0aXBsaWNhdGl2ZTEiPm11bHRpcGxpY2F0aXZlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI21vZGFibGUxIj5tb2RhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAiaW50ZWdlcl9tdWx0aXBsaWNhdGl2ZTIiPmludGVnZXJfbXVsdGlwbGljYXRpdmUmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmludGVnZXJfbXVsdGlwbGljYXRpdmUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjbXVsdGlwbGljYXRpdmUyIj5tdWx0aXBsaWNhdGl2ZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjbW9kYWJsZTIiPm1vZGFibGUmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImFyaXRobWV0aWMxIj5hcml0aG1ldGljJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5hcml0aG1ldGljMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FkZGl0aXZlMSI+YWRkaXRpdmUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNtdWx0aXBsaWNhdGl2ZTEiPm11bHRpcGxpY2F0aXZlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJhcml0aG1ldGljMiI+YXJpdGhtZXRpYyZsdDtULCBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+YXJpdGhtZXRpYzImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNhZGRpdGl2ZTIiPmFkZGl0aXZlJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNtdWx0aXBsaWNhdGl2ZTIiPm11bHRpcGxpY2F0aXZlJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgImludGVnZXJfYXJpdGhtZXRpYzEiPmludGVnZXJfYXJpdGhtZXRpYyZsdDtUJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+aW50ZWdlcl9hcml0aG1ldGljMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FkZGl0aXZlMSI+YWRkaXRpdmUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNpbnRlZ2VyX211bHRpcGxpY2F0aXZlMSI+aW50ZWdlcl9tdWx0aXBsaWNhdGl2ZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iaW50ZWdlcl9hcml0aG1ldGljMiI+aW50ZWdlcl9hcml0aG1ldGljJmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5pbnRlZ2VyX2FyaXRobWV0aWMyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjYWRkaXRpdmUyIj5hZGRpdGl2ZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNpbnRlZ2VyX211bHRpcGxpY2F0aXZlMiI+aW50ZWdlcl9tdWx0aXBsaWNhdGl2ZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImJpdHdpc2UxIj5iaXR3aXNlJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5iaXR3aXNlMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI3hvcmFibGUxIj54b3JhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FuZGFibGUxIj5hbmRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI29yYWJsZTEiPm9yYWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iYml0d2lzZTIiPmJpdHdpc2UmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmJpdHdpc2UyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjeG9yYWJsZTIiPnhvcmFibGUmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjYW5kYWJsZTIiPmFuZGFibGUmbHQ7VCwgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjb3JhYmxlMiI+b3JhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAidW5pdF9zdGVwcGFibGUiPnVuaXRfc3RlcHBhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjaW5jcmVtZW50YWJsZSI+aW5jcmVtZW50YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2RlY3JlbWVudGFibGUiPmRlY3JlbWVudGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9InNoaWZ0YWJsZTEiPnNoaWZ0YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+c2hpZnRhYmxlMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjbGVmdF9zaGlmdGFibGUxIj5sZWZ0X3NoaWZ0YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI3JpZ2h0X3NoaWZ0YWJsZTEiPnJpZ2h0X3NoaWZ0YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0ic2hpZnRhYmxlMiI+c2hpZnRhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5zaGlmdGFibGUyJmx0O1QsIFUmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjbGVmdF9zaGlmdGFibGUyIj5sZWZ0X3NoaWZ0YWJsZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjcmlnaHRfc2hpZnRhYmxlMiI+cmlnaHRfc2hpZnRhYmxlJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgInJpbmdfb3BlcmF0b3JzMSI+cmluZ19vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPnJpbmdfb3BlcmF0b3JzMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FkZGl0aXZlMSI+YWRkaXRpdmUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNtdWx0aXBsaWFibGUxIj5tdWx0aXBsaWFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9InJpbmdfb3BlcmF0b3JzMiI+cmluZ19vcGVyYXRvcnMmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPnJpbmdfb3BlcmF0b3JzMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2FkZGl0aXZlMiI+YWRkaXRpdmUmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI3N1YnRyYWN0YWJsZTJfbGVmdCI+c3VidHJhY3RhYmxlMl9sZWZ0Jmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNtdWx0aXBsaWFibGUyIj5tdWx0aXBsaWFibGUmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAib3JkZXJlZF9yaW5nX29wZXJhdG9yczEiPm9yZGVyZWRfcmluZ19vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKworICAgICAgICAgPGNvZGU+b3JkZXJlZF9yaW5nX29wZXJhdG9yczEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI3Jpbmdfb3BlcmF0b3JzMSI+cmluZ19vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiN0b3RhbGx5X29yZGVyZWQxIj50b3RhbGx5X29yZGVyZWQmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJvcmRlcmVkX3Jpbmdfb3BlcmF0b3JzMiI+b3JkZXJlZF9yaW5nX29wZXJhdG9ycyZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+b3JkZXJlZF9yaW5nX29wZXJhdG9yczImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNyaW5nX29wZXJhdG9yczIiPnJpbmdfb3BlcmF0b3JzJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiN0b3RhbGx5X29yZGVyZWQyIj50b3RhbGx5X29yZGVyZWQmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAiZmllbGRfb3BlcmF0b3JzMSI+ZmllbGRfb3BlcmF0b3JzJmx0O1QmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5maWVsZF9vcGVyYXRvcnMxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNyaW5nX29wZXJhdG9yczEiPnJpbmdfb3BlcmF0b3JzJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjZGl2aWRhYmxlMSI+ZGl2aWRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJmaWVsZF9vcGVyYXRvcnMyIj5maWVsZF9vcGVyYXRvcnMmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPmZpZWxkX29wZXJhdG9yczImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNyaW5nX29wZXJhdG9yczIiPnJpbmdfb3BlcmF0b3JzJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNkaXZpZGFibGUyIj5kaXZpZGFibGUmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2RpdmlkYWJsZTJfbGVmdCI+ZGl2aWRhYmxlMl9sZWZ0Jmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgIm9yZGVyZWRfZmllbGRfb3BlcmF0b3JzMSI+b3JkZXJlZF9maWVsZF9vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKworICAgICAgICAgPGNvZGU+b3JkZXJlZF9maWVsZF9vcGVyYXRvcnMxJmx0O1QmZ3Q7PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNmaWVsZF9vcGVyYXRvcnMxIj5maWVsZF9vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiN0b3RhbGx5X29yZGVyZWQxIj50b3RhbGx5X29yZGVyZWQmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJvcmRlcmVkX2ZpZWxkX29wZXJhdG9yczIiPm9yZGVyZWRfZmllbGRfb3BlcmF0b3JzJmx0O1QsCisgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48YnI+CisgICAgICAgICA8Y29kZT5vcmRlcmVkX2ZpZWxkX29wZXJhdG9yczImbHQ7VCwgVSZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNmaWVsZF9vcGVyYXRvcnMyIj5maWVsZF9vcGVyYXRvcnMmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI3RvdGFsbHlfb3JkZXJlZDIiPnRvdGFsbHlfb3JkZXJlZCZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMxIj5ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjxicj4KKworICAgICAgICAgPGNvZGU+ZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMSZsdDtUJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjcmluZ19vcGVyYXRvcnMxIj5yaW5nX29wZXJhdG9ycyZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2RpdmlkYWJsZTEiPmRpdmlkYWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNtb2RhYmxlMSI+bW9kYWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgImV1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczIiPmV1Y2xpZGVhbl9yaW5nX29wZXJhdG9ycyZsdDtULAorICAgICAgICBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+ZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI3Jpbmdfb3BlcmF0b3JzMiI+cmluZ19vcGVyYXRvcnMmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2RpdmlkYWJsZTIiPmRpdmlkYWJsZSZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjZGl2aWRhYmxlMl9sZWZ0Ij5kaXZpZGFibGUyX2xlZnQmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI21vZGFibGUyIj5tb2RhYmxlJmx0O1QsIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI21vZGFibGUyX2xlZnQiPm1vZGFibGUyX2xlZnQmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPQorICAgICAgICAib3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMxIj5vcmRlcmVkX2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9ycyZsdDtUJmd0OzwvYT48L2NvZGU+PGJyPgorCisgICAgICAgICA8Y29kZT5vcmRlcmVkX2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczEmbHQ7VCZndDs8L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczEiPmV1Y2xpZGVhbl9yaW5nX29wZXJhdG9ycyZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI3RvdGFsbHlfb3JkZXJlZDEiPnRvdGFsbHlfb3JkZXJlZCZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgIm9yZGVyZWRfZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMiI+b3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMmbHQ7VCwKKyAgICAgICAgVSZndDs8L2E+PC9jb2RlPjxicj4KKyAgICAgICAgIDxjb2RlPm9yZGVyZWRfZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzMiI+ZXVjbGlkZWFuX3Jpbmdfb3BlcmF0b3JzJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiN0b3RhbGx5X29yZGVyZWQyIj50b3RhbGx5X29yZGVyZWQmbHQ7VCwKKyAgICAgICAgICAgIFUmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8aDQ+U3BlbGxpbmc6IGV1Y2xpZGVhbiB2cy4gZXVjbGlkaWFuPC9oND4KKworICAgIDxwPk9sZGVyIHZlcnNpb25zIG9mIHRoZSBCb29zdC5PcGVyYXRvcnMgbGlicmFyeSB1c2VkCisgICAgJnF1b3Q7PGNvZGU+ZXVjbGlkaWFuPC9jb2RlPiZxdW90OywgYnV0IGl0IHdhcyBwb2ludGVkIG91dCB0aGF0CisgICAgJnF1b3Q7PGNvZGU+ZXVjbGlkZWFuPC9jb2RlPiZxdW90OyBpcyB0aGUgbW9yZSBjb21tb24gc3BlbGxpbmcuCisgICAgVG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24sIHRoZSBsaWJyYXJ5IG5vdyBzdXBwb3J0cworICAgIGJvdGggc3BlbGxpbmdzLgorICAgIDwvcD4KKworICAgIDxoMz48YSBuYW1lPSJleF9vcHJzIj5FeGFtcGxlPC9hPiBUZW1wbGF0ZXM8L2gzPgorCisgICAgPHA+VGhlIGFyaXRobWV0aWMgb3BlcmF0b3IgY2xhc3MgdGVtcGxhdGVzIDxjb2RlPjxhIGhyZWY9CisgICAgIiNvcGVyYXRvcnMxIj5vcGVyYXRvcnMmbHQ7Jmd0OzwvYT48L2NvZGU+IGFuZCA8Y29kZT48YSBocmVmPQorICAgICIjb3BlcmF0b3JzMiI+b3BlcmF0b3JzMiZsdDsmZ3Q7PC9hPjwvY29kZT4gYXJlIGV4YW1wbGVzIG9mCisgICAgbm9uLWV4dGVuc2libGUgb3BlcmF0b3IgZ3JvdXBpbmcgY2xhc3Nlcy4gVGhlc2UgbGVnYWN5IGNsYXNzIHRlbXBsYXRlcywKKyAgICBmcm9tIHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBoZWFkZXIsIGNhbm5vdCBiZSB1c2VkIGZvciA8YSBocmVmPQorICAgICIjY2hhaW5pbmciPmJhc2UgY2xhc3MgY2hhaW5pbmc8L2E+LjwvcD4KKworICAgIDx0YWJsZSBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIxIiBhbGlnbj0iY2VudGVyIj4KKyAgICAgIDxjYXB0aW9uPgorICAgICAgICBGaW5hbCBBcml0aG1ldGljIE9wZXJhdG9yIFRlbXBsYXRlIENsYXNzZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBwcmltYXJ5IG9wZXJhbmQgdHlwZTwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlU8L2NvZGU+OiBhbHRlcm5hdGUgb3BlcmFuZCB0eXBlPC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPlRlbXBsYXRlPC90aD4KKworICAgICAgICA8dGg+Q29tcG9uZW50IE9wZXJhdG9yIFRlbXBsYXRlczwvdGg+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJvcGVyYXRvcnMxIj5vcGVyYXRvcnMmbHQ7VCZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiN0b3RhbGx5X29yZGVyZWQxIj50b3RhbGx5X29yZGVyZWQmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNpbnRlZ2VyX2FyaXRobWV0aWMxIj5pbnRlZ2VyX2FyaXRobWV0aWMmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjYml0d2lzZTEiPmJpdHdpc2UmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiN1bml0X3N0ZXBwYWJsZSI+dW5pdF9zdGVwcGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9Im9wZXJhdG9yczIiPm9wZXJhdG9ycyZsdDtULCBVJmd0OzwvYT48L2NvZGU+PGJyPgorICAgICAgICAgPGNvZGU+b3BlcmF0b3JzMiZsdDtULCBVJmd0OzwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI3RvdGFsbHlfb3JkZXJlZDIiPnRvdGFsbHlfb3JkZXJlZCZsdDtULAorICAgICAgICAgICAgVSZndDs8L2E+PC9jb2RlPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPSIjaW50ZWdlcl9hcml0aG1ldGljMiI+aW50ZWdlcl9hcml0aG1ldGljJmx0O1QsCisgICAgICAgICAgICBVJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNiaXR3aXNlMiI+Yml0d2lzZSZsdDtULCBVJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPGgzPjxhIG5hbWU9ImFfZGVtbyI+QXJpdGhtZXRpYyBPcGVyYXRvcnMgRGVtb25zdHJhdGlvbjwvYT4gYW5kIFRlc3QKKyAgICBQcm9ncmFtPC9oMz4KKworICAgIDxwPlRoZSA8Y2l0ZT48YSBocmVmPSJvcGVyYXRvcnNfdGVzdC5jcHAiPm9wZXJhdG9yc190ZXN0LmNwcDwvYT48L2NpdGU+CisgICAgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgYXJpdGhtZXRpYyBvcGVyYXRvciB0ZW1wbGF0ZXMsIGFuZAorICAgIGNhbiBhbHNvIGJlIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3Qgb3BlcmF0aW9uLiBDaGVjayB0aGUgY29tcGlsZXIgc3RhdHVzCisgICAgcmVwb3J0IGZvciB0aGUgdGVzdCByZXN1bHRzIHdpdGggc2VsZWN0ZWQgcGxhdGZvcm1zLjwvcD4KKworICAgIDxoMj48YSBuYW1lPSJkZXJlZiI+RGVyZWZlcmVuY2U8L2E+IE9wZXJhdG9ycyBhbmQgSXRlcmF0b3IgSGVscGVyczwvaDI+CisKKyAgICA8cD5UaGUgPGEgaHJlZj0iI2l0ZXJhdG9yIj5pdGVyYXRvciBoZWxwZXI8L2E+IHRlbXBsYXRlcyBlYXNlIHRoZSB0YXNrIG9mCisgICAgY3JlYXRpbmcgYSBjdXN0b20gaXRlcmF0b3IuIFNpbWlsYXIgdG8gYXJpdGhtZXRpYyB0eXBlcywgYSBjb21wbGV0ZQorICAgIGl0ZXJhdG9yIGhhcyBtYW55IG9wZXJhdG9ycyB0aGF0IGFyZSAicmVkdW5kYW50IiBhbmQgY2FuIGJlIGltcGxlbWVudGVkCisgICAgaW4gdGVybXMgb2YgdGhlIGNvcmUgc2V0IG9mIG9wZXJhdG9ycy48L3A+CisKKyAgICA8cD5UaGUgPGEgaHJlZj0iI2RlcmVmZXJlbmNlIj5kZXJlZmVyZW5jZSBvcGVyYXRvcnM8L2E+IHdlcmUgbW90aXZhdGVkIGJ5CisgICAgdGhlIDxhIGhyZWY9IiNpdGVyYXRvciI+aXRlcmF0b3IgaGVscGVyczwvYT4sIGJ1dCBhcmUgb2Z0ZW4gdXNlZnVsIGluCisgICAgbm9uLWl0ZXJhdG9yIGNvbnRleHRzIGFzIHdlbGwuIE1hbnkgb2YgdGhlIHJlZHVuZGFudCBpdGVyYXRvciBvcGVyYXRvcnMKKyAgICBhcmUgYWxzbyBhcml0aG1ldGljIG9wZXJhdG9ycywgc28gdGhlIGl0ZXJhdG9yIGhlbHBlciBjbGFzc2VzIGJvcnJvdyBtYW55CisgICAgb2YgdGhlIG9wZXJhdG9ycyBkZWZpbmVkIGFib3ZlLiBJbiBmYWN0LCBvbmx5IHR3byBuZXcgb3BlcmF0b3JzIG5lZWQgdG8KKyAgICBiZSBkZWZpbmVkICh0aGUgcG9pbnRlci10by1tZW1iZXIgPGNvZGU+b3BlcmF0b3ItJmd0OzwvY29kZT4gYW5kIHRoZQorICAgIHN1YnNjcmlwdCA8Y29kZT5vcGVyYXRvcltdPC9jb2RlPikhPC9wPgorCisgICAgPHA+VGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIHR5cGVzIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIGRlcmVmZXJlbmNlCisgICAgb3BlcmF0b3JzIGFyZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgZXhwcmVzc2lvbnMgd2hpY2ggbXVzdCBiZSB2YWxpZCBhbmQKKyAgICB0aGVpciByZXR1cm4gdHlwZS4gVGhlIGNvbXBvc2l0ZSBvcGVyYXRvciB0ZW1wbGF0ZXMgbGlzdCB0aGVpciBjb21wb25lbnQKKyAgICB0ZW1wbGF0ZXMsIHdoaWNoIHRoZSBpbnN0YW50aWF0aW5nIHR5cGUgbXVzdCBzdXBwb3J0LCBhbmQgcG9zc2libHkgb3RoZXIKKyAgICByZXF1aXJlbWVudHMuPC9wPgorCisgICAgPGgzPjxhIG5hbWU9ImRlcmVmZXJlbmNlIj5EZXJlZmVyZW5jZTwvYT4gT3BlcmF0b3JzPC9oMz4KKworICAgIDxwPkFsbCB0aGUgZGVyZWZlcmVuY2Ugb3BlcmF0b3IgdGVtcGxhdGVzIGluIHRoaXMgdGFibGUgYWNjZXB0IGFuCisgICAgb3B0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyIChub3Qgc2hvd24pIHRvIGJlIHVzZWQgZm9yIDxhIGhyZWY9CisgICAgIiNjaGFpbmluZyI+YmFzZSBjbGFzcyBjaGFpbmluZzwvYT4uPC9wPgorCisgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjEiIGFsaWduPSJjZW50ZXIiPgorICAgICAgPGNhcHRpb24+CisgICAgICAgIERlcmVmZXJlbmNlIE9wZXJhdG9yIFRlbXBsYXRlIENsYXNzZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMyI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBvcGVyYW5kIHR5cGU8L3RkPgorCisgICAgICAgICAgICAgIDx0ZD48Y29kZT5QPC9jb2RlPjogPGNvZGU+cG9pbnRlcjwvY29kZT4gdHlwZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD48Y29kZT5EPC9jb2RlPjogPGNvZGU+ZGlmZmVyZW5jZV90eXBlPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlI8L2NvZGU+OiA8Y29kZT5yZWZlcmVuY2U8L2NvZGU+IHR5cGU8L3RkPgorICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+PGNvZGU+aTwvY29kZT46IG9iamVjdCBvZiB0eXBlIDxjb2RlPlQ8L2NvZGU+IChhbgorICAgICAgICAgICAgICBpdGVyYXRvcik8L3RkPgorCisgICAgICAgICAgICAgIDx0ZD48Y29kZT5uPC9jb2RlPjogb2JqZWN0IG9mIHR5cGUgPGNvZGU+RDwvY29kZT4gKGFuCisgICAgICAgICAgICAgIGluZGV4KTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0aD5UZW1wbGF0ZTwvdGg+CisKKyAgICAgICAgPHRoPlN1cHBsaWVkIE9wZXJhdGlvbnM8L3RoPgorCisgICAgICAgIDx0aD5SZXF1aXJlbWVudHM8L3RoPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iZGVyZWZlcmVuY2VhYmxlIj5kZXJlZmVyZW5jZWFibGUmbHQ7VCwKKyAgICAgICAgUCZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPlAgb3BlcmF0b3ItJmd0OygpIGNvbnN0PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPjxjb2RlPippPC9jb2RlPi4gQWRkcmVzcyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgY29udmVydGlibGUKKyAgICAgICAgdG8gPGNvZGU+UDwvY29kZT4uPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9ImluZGV4YWJsZSI+aW5kZXhhYmxlJmx0O1QsIEQsCisgICAgICAgIFImZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT5SIG9wZXJhdG9yW10oRCBuKSBjb25zdDwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD48Y29kZT4qKGkmbmJzcDsrJm5ic3A7bik8L2NvZGU+LiBSZXR1cm4gb2YgdHlwZQorICAgICAgICA8Y29kZT5SPC9jb2RlPi48L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPGgzPjxhIG5hbWU9ImdycGRfaXRlcl9vcHJzIj5Hcm91cGVkIEl0ZXJhdG9yIE9wZXJhdG9yczwvYT48L2gzPgorCisgICAgPHA+VGhlcmUgYXJlIGZpdmUgaXRlcmF0b3Igb3BlcmF0b3IgY2xhc3MgdGVtcGxhdGVzLCBlYWNoIGZvciBhIGRpZmZlcmVudAorICAgIGNhdGVnb3J5IG9mIGl0ZXJhdG9yLiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBvcGVyYXRvciBncm91cHMgZm9yCisgICAgYW55IGNhdGVnb3J5IHRoYXQgYSBjdXN0b20gaXRlcmF0b3IgY291bGQgZGVmaW5lLiBUaGVzZSBjbGFzcyB0ZW1wbGF0ZXMKKyAgICBoYXZlIGFuIGFkZGl0aW9uYWwgb3B0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyIDxjb2RlPkI8L2NvZGU+LCB3aGljaCBpcworICAgIG5vdCBzaG93biwgdG8gc3VwcG9ydCA8YSBocmVmPSIjY2hhaW5pbmciPmJhc2UgY2xhc3MgY2hhaW5pbmc8L2E+LjwvcD4KKworICAgIDx0YWJsZSBjZWxscGFkZGluZz0iNSIgYm9yZGVyPSIxIiBhbGlnbj0iY2VudGVyIj4KKyAgICAgIDxjYXB0aW9uPgorICAgICAgICBJdGVyYXRvciBPcGVyYXRvciBDbGFzcyBUZW1wbGF0ZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBvcGVyYW5kIHR5cGU8L3RkPgorCisgICAgICAgICAgICAgIDx0ZD48Y29kZT5QPC9jb2RlPjogPGNvZGU+cG9pbnRlcjwvY29kZT4gdHlwZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD48Y29kZT5EPC9jb2RlPjogPGNvZGU+ZGlmZmVyZW5jZV90eXBlPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlI8L2NvZGU+OiA8Y29kZT5yZWZlcmVuY2U8L2NvZGU+IHR5cGU8L3RkPgorICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+PGNvZGU+VjwvY29kZT46IDxjb2RlPnZhbHVlX3R5cGU8L2NvZGU+PC90ZD4KKworICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0aD5UZW1wbGF0ZTwvdGg+CisKKyAgICAgICAgPHRoPkNvbXBvbmVudCBPcGVyYXRvciBUZW1wbGF0ZXM8L3RoPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iaW5wdXRfaXRlcmF0YWJsZSI+aW5wdXRfaXRlcmF0YWJsZSZsdDtULAorICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2VxdWFsaXR5X2NvbXBhcmFibGUxIj5lcXVhbGl0eV9jb21wYXJhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjaW5jcmVtZW50YWJsZSI+aW5jcmVtZW50YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNkZXJlZmVyZW5jZWFibGUiPmRlcmVmZXJlbmNlYWJsZSZsdDtULAorICAgICAgICAgICAgUCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJvdXRwdXRfaXRlcmF0YWJsZSI+b3V0cHV0X2l0ZXJhdGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48Y29kZT48YSBocmVmPQorICAgICAgICAgICAgIiNpbmNyZW1lbnRhYmxlIj5pbmNyZW1lbnRhYmxlJmx0O1QmZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorCisgICAgICA8dHI+CisgICAgICAgIDx0ZD48Y29kZT48YSBuYW1lPSJmb3J3YXJkX2l0ZXJhdGFibGUiPmZvcndhcmRfaXRlcmF0YWJsZSZsdDtULAorICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNpbnB1dF9pdGVyYXRhYmxlIj5pbnB1dF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgImJpZGlyZWN0aW9uYWxfaXRlcmF0YWJsZSI+YmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgIFAmZ3Q7PC9hPjwvY29kZT48L3RkPgorCisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0iI2ZvcndhcmRfaXRlcmF0YWJsZSI+Zm9yd2FyZF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2RlY3JlbWVudGFibGUiPmRlY3JlbWVudGFibGUmbHQ7VCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJyYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUiPnJhbmRvbV9hY2Nlc3NfaXRlcmF0YWJsZSZsdDtULCBQLCBELAorICAgICAgICBSJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2JpZGlyZWN0aW9uYWxfaXRlcmF0YWJsZSI+YmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI3RvdGFsbHlfb3JkZXJlZDEiPnRvdGFsbHlfb3JkZXJlZCZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNhZGRpdGl2ZTIiPmFkZGl0aXZlJmx0O1QsCisgICAgICAgICAgICBEJmd0OzwvYT48L2NvZGU+PC9saT4KKworICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNpbmRleGFibGUiPmluZGV4YWJsZSZsdDtULCBELAorICAgICAgICAgICAgUiZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDxoMz48YSBuYW1lPSJpdGVyYXRvciI+SXRlcmF0b3I8L2E+IEhlbHBlcnM8L2gzPgorCisgICAgPHA+VGhlcmUgYXJlIGFsc28gZml2ZSBpdGVyYXRvciBoZWxwZXIgY2xhc3MgdGVtcGxhdGVzLCBlYWNoCisgICAgY29ycmVzcG9uZGluZyB0byBhIGRpZmZlcmVudCBpdGVyYXRvciBjYXRlZ29yeS4gVGhlc2UgY2xhc3NlcyBjYW5ub3QgYmUKKyAgICB1c2VkIGZvciA8YSBocmVmPSIjY2hhaW5pbmciPmJhc2UgY2xhc3MgY2hhaW5pbmc8L2E+LiBUaGUgZm9sbG93aW5nCisgICAgc3VtbWFyaWVzIHNob3cgdGhhdCB0aGVzZSBjbGFzcyB0ZW1wbGF0ZXMgc3VwcGx5IGJvdGggdGhlIGl0ZXJhdG9yCisgICAgb3BlcmF0b3JzIGZyb20gdGhlIDxhIGhyZWY9IiNncnBkX2l0ZXJfb3BycyI+aXRlcmF0b3Igb3BlcmF0b3IgY2xhc3MKKyAgICB0ZW1wbGF0ZXM8L2E+IGFuZCB0aGUgaXRlcmF0b3IgdHlwZWRlZidzIHJlcXVpcmVkIGJ5IHRoZSBDKysgc3RhbmRhcmQKKyAgICAoPGNvZGU+aXRlcmF0b3JfY2F0ZWdvcnk8L2NvZGU+LCA8Y29kZT52YWx1ZV90eXBlPC9jb2RlPiwKKyAgICA8aT5ldGMuPC9pPikuPC9wPgorCisgICAgPHRhYmxlIGNlbGxwYWRkaW5nPSI1IiBib3JkZXI9IjEiIGFsaWduPSJjZW50ZXIiPgorICAgICAgPGNhcHRpb24+CisgICAgICAgIEl0ZXJhdG9yIEhlbHBlciBDbGFzcyBUZW1wbGF0ZXMKKyAgICAgIDwvY2FwdGlvbj4KKworICAgICAgPHRyPgorICAgICAgICA8dGQgY29sc3Bhbj0iMiI+CisgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMSI+CisgICAgICAgICAgICA8Y2FwdGlvbj4KKyAgICAgICAgICAgICAgPGVtPktleTwvZW0+CisgICAgICAgICAgICA8L2NhcHRpb24+CisKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlQ8L2NvZGU+OiBvcGVyYW5kIHR5cGU8L3RkPgorCisgICAgICAgICAgICAgIDx0ZD48Y29kZT5QPC9jb2RlPjogPGNvZGU+cG9pbnRlcjwvY29kZT4gdHlwZTwvdGQ+CisgICAgICAgICAgICA8L3RyPgorCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgIDx0ZD48Y29kZT5EPC9jb2RlPjogPGNvZGU+ZGlmZmVyZW5jZV90eXBlPC9jb2RlPjwvdGQ+CisKKyAgICAgICAgICAgICAgPHRkPjxjb2RlPlI8L2NvZGU+OiA8Y29kZT5yZWZlcmVuY2U8L2NvZGU+IHR5cGU8L3RkPgorICAgICAgICAgICAgPC90cj4KKworICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICA8dGQ+PGNvZGU+VjwvY29kZT46IDxjb2RlPnZhbHVlX3R5cGU8L2NvZGU+PC90ZD4KKworICAgICAgICAgICAgICA8dGQ+PGNvZGU+eDEsIHgyPC9jb2RlPjogb2JqZWN0cyBvZiB0eXBlIDxjb2RlPlQ8L2NvZGU+PC90ZD4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPlRlbXBsYXRlPC90aD4KKworICAgICAgICA8dGg+T3BlcmF0aW9ucyAmYW1wOyBSZXF1aXJlbWVudHM8L3RoPgorICAgICAgPC90cj4KKworICAgICAgPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0iaW5wdXRfaXRlcmF0b3JfaGVscGVyIj5pbnB1dF9pdGVyYXRvcl9oZWxwZXImbHQ7VCwKKyAgICAgICAgViwgRCwgUCwgUiZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIFN1cHBvcnRzIHRoZSBvcGVyYXRpb25zIGFuZCBoYXMgdGhlIHJlcXVpcmVtZW50cyBvZgorCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNpbnB1dF9pdGVyYXRhYmxlIj5pbnB1dF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgIm91dHB1dF9pdGVyYXRvcl9oZWxwZXIiPm91dHB1dF9pdGVyYXRvcl9oZWxwZXImbHQ7VCZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIFN1cHBvcnRzIHRoZSBvcGVyYXRpb25zIGFuZCBoYXMgdGhlIHJlcXVpcmVtZW50cyBvZgorCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI291dHB1dF9pdGVyYXRhYmxlIj5vdXRwdXRfaXRlcmF0YWJsZSZsdDtUJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICAgIFNlZSBhbHNvIFs8YSBocmVmPSIjMSI+MTwvYT5dLCBbPGEgaHJlZj0iIzIiPjI8L2E+XS4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0ciB2YWxpZ249ImJhc2VsaW5lIj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJmb3J3YXJkX2l0ZXJhdG9yX2hlbHBlciI+Zm9yd2FyZF9pdGVyYXRvcl9oZWxwZXImbHQ7VCwgViwgRCwgUCwKKyAgICAgICAgUiZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIFN1cHBvcnRzIHRoZSBvcGVyYXRpb25zIGFuZCBoYXMgdGhlIHJlcXVpcmVtZW50cyBvZgorCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9IiNmb3J3YXJkX2l0ZXJhdGFibGUiPmZvcndhcmRfaXRlcmF0YWJsZSZsdDtULAorICAgICAgICAgICAgUCZndDs8L2E+PC9jb2RlPjwvbGk+CisgICAgICAgICAgPC91bD4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisKKyAgICAgIDx0ciB2YWxpZ249ImJhc2VsaW5lIj4KKyAgICAgICAgPHRkPjxjb2RlPjxhIG5hbWU9CisgICAgICAgICJiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX2hlbHBlciI+YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl9oZWxwZXImbHQ7VCwKKyAgICAgICAgViwgRCwgUCwgUiZndDs8L2E+PC9jb2RlPjwvdGQ+CisKKyAgICAgICAgPHRkPgorICAgICAgICAgIFN1cHBvcnRzIHRoZSBvcGVyYXRpb25zIGFuZCBoYXMgdGhlIHJlcXVpcmVtZW50cyBvZgorCisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxjb2RlPjxhIGhyZWY9CisgICAgICAgICAgICAiI2JpZGlyZWN0aW9uYWxfaXRlcmF0YWJsZSI+YmlkaXJlY3Rpb25hbF9pdGVyYXRhYmxlJmx0O1QsCisgICAgICAgICAgICBQJmd0OzwvYT48L2NvZGU+PC9saT4KKyAgICAgICAgICA8L3VsPgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKworICAgICAgPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorICAgICAgICA8dGQ+PGNvZGU+PGEgbmFtZT0KKyAgICAgICAgInJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfaGVscGVyIj5yYW5kb21fYWNjZXNzX2l0ZXJhdG9yX2hlbHBlciZsdDtULAorICAgICAgICBWLCBELCBQLCBSJmd0OzwvYT48L2NvZGU+PC90ZD4KKworICAgICAgICA8dGQ+CisgICAgICAgICAgU3VwcG9ydHMgdGhlIG9wZXJhdGlvbnMgYW5kIGhhcyB0aGUgcmVxdWlyZW1lbnRzIG9mCisKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PGNvZGU+PGEgaHJlZj0KKyAgICAgICAgICAgICIjcmFuZG9tX2FjY2Vzc19pdGVyYXRhYmxlIj5yYW5kb21fYWNjZXNzX2l0ZXJhdGFibGUmbHQ7VCwgUCwgRCwKKyAgICAgICAgICAgIFImZ3Q7PC9hPjwvY29kZT48L2xpPgorICAgICAgICAgIDwvdWw+CisgICAgICAgICAgVG8gc2F0aXNmeSA8Y2l0ZT48YSBocmVmPQorICAgICAgICAgICJodHRwOi8vd3d3LnNnaS5jb20vdGVjaC9zdGwvUmFuZG9tQWNjZXNzSXRlcmF0b3IuaHRtbCI+UmFuZG9tQWNjZXNzSXRlcmF0b3I8L2E+PC9jaXRlPiwKKyAgICAgICAgICA8Y29kZT54MSAtIHgyPC9jb2RlPiB3aXRoIHJldHVybiBjb252ZXJ0aWJsZSB0byA8Y29kZT5EPC9jb2RlPiBpcworICAgICAgICAgIGFsc28gcmVxdWlyZWQuCisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisKKyAgICA8aDQ+PGEgbmFtZT0iaXRlcmF0b3JfaGVscGVyc19ub3RlcyI+SXRlcmF0b3IgSGVscGVyIE5vdGVzPC9hPjwvaDQ+CisKKyAgICA8cD48YSBuYW1lPSIxIj5bMV08L2E+IFVubGlrZSBvdGhlciBpdGVyYXRvciBoZWxwZXJzIHRlbXBsYXRlcywKKyAgICA8Y29kZT5vdXRwdXRfaXRlcmF0b3JfaGVscGVyPC9jb2RlPiB0YWtlcyBvbmx5IG9uZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgLQorICAgIHRoZSB0eXBlIG9mIGl0cyB0YXJnZXQgY2xhc3MuIEFsdGhvdWdoIHRvIHNvbWUgaXQgbWlnaHQgc2VlbSBsaWtlIGFuCisgICAgdW5uZWNlc3NhcnkgcmVzdHJpY3Rpb24sIHRoZSBzdGFuZGFyZCByZXF1aXJlcworICAgIDxjb2RlPmRpZmZlcmVuY2VfdHlwZTwvY29kZT4gYW5kIDxjb2RlPnZhbHVlX3R5cGU8L2NvZGU+IG9mIGFueSBvdXRwdXQKKyAgICBpdGVyYXRvciB0byBiZSA8Y29kZT52b2lkPC9jb2RlPiAoMjQuMy4xIFtsaWIuaXRlcmF0b3IudHJhaXRzXSksIGFuZAorICAgIDxjb2RlPm91dHB1dF9pdGVyYXRvcl9oZWxwZXI8L2NvZGU+IHRlbXBsYXRlIHJlc3BlY3RzIHRoaXMgcmVxdWlyZW1lbnQuCisgICAgQWxzbywgb3V0cHV0IGl0ZXJhdG9ycyBpbiB0aGUgc3RhbmRhcmQgaGF2ZSB2b2lkIDxjb2RlPnBvaW50ZXI8L2NvZGU+IGFuZAorICAgIDxjb2RlPnJlZmVyZW5jZTwvY29kZT4gdHlwZXMsIHNvIHRoZSA8Y29kZT5vdXRwdXRfaXRlcmF0b3JfaGVscGVyPC9jb2RlPgorICAgIGRvZXMgdGhlIHNhbWUuPC9wPgorCisgICAgPHA+PGEgbmFtZT0iMiI+WzJdPC9hPiBBcyBzZWxmLXByb3h5aW5nIGlzIHRoZSBlYXNpZXN0IGFuZCBtb3N0IGNvbW1vbgorICAgIHdheSB0byBpbXBsZW1lbnQgb3V0cHV0IGl0ZXJhdG9ycyAoc2VlLCBmb3IgZXhhbXBsZSwgaW5zZXJ0IFsyNC40LjJdIGFuZAorICAgIHN0cmVhbSBpdGVyYXRvcnMgWzI0LjVdIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KSwKKyAgICA8Y29kZT5vdXRwdXRfaXRlcmF0b3JfaGVscGVyPC9jb2RlPiBzdXBwb3J0cyB0aGUgaWRpb20gYnkgZGVmaW5pbmcKKyAgICA8Y29kZT5vcGVyYXRvcio8L2NvZGU+IGFuZCA8Y29kZT5vcGVyYXRvcisrPC9jb2RlPiBtZW1iZXIgZnVuY3Rpb25zIHdoaWNoCisgICAganVzdCByZXR1cm4gYSBub24tY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBpdGVyYXRvciBpdHNlbGYuIFN1cHBvcnQgZm9yCisgICAgc2VsZi1wcm94eWluZyBhbGxvd3MgdXMsIGluIG1hbnkgY2FzZXMsIHRvIHJlZHVjZSB0aGUgdGFzayBvZiB3cml0aW5nIGFuCisgICAgb3V0cHV0IGl0ZXJhdG9yIHRvIHdyaXRpbmcganVzdCB0d28gbWVtYmVyIGZ1bmN0aW9ucyAtIGFuIGFwcHJvcHJpYXRlCisgICAgY29uc3RydWN0b3IgYW5kIGEgY29weS1hc3NpZ25tZW50IG9wZXJhdG9yLiBGb3IgZXhhbXBsZSwgaGVyZSBpcyBhCisgICAgcG9zc2libGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+PGEgaHJlZj0KKyAgICAiLi4vaXRlcmF0b3IvZG9jL2Z1bmN0aW9uX291dHB1dF9pdGVyYXRvci5odG1sIj5ib29zdDo6ZnVuY3Rpb25fb3V0cHV0X2l0ZXJhdG9yPC9hPjwvY29kZT4KKyAgICBhZGFwdG9yOjwvcD4KKzxwcmU+Cit0ZW1wbGF0ZSZsdDtjbGFzcyBVbmFyeUZ1bmN0aW9uJmd0Oworc3RydWN0IGZ1bmN0aW9uX291dHB1dF9pdGVyYXRvcgorICAgIDogYm9vc3Q6Om91dHB1dF9pdGVyYXRvcl9oZWxwZXImbHQ7IGZ1bmN0aW9uX291dHB1dF9pdGVyYXRvciZsdDtVbmFyeUZ1bmN0aW9uJmd0OyAmZ3Q7Cit7CisgICAgZXhwbGljaXQgZnVuY3Rpb25fb3V0cHV0X2l0ZXJhdG9yKFVuYXJ5RnVuY3Rpb24gY29uc3QmYW1wOyBmID0gVW5hcnlGdW5jdGlvbigpKQorICAgICAgICA6IGZ1bmMoZikge30KKworICAgIHRlbXBsYXRlJmx0O3R5cGVuYW1lIFQmZ3Q7CisgICAgZnVuY3Rpb25fb3V0cHV0X2l0ZXJhdG9yJmFtcDsgb3BlcmF0b3I9KFQgY29uc3QmYW1wOyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMtJmd0O2Z1bmModmFsdWUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBVbmFyeUZ1bmN0aW9uIGZ1bmM7Cit9OworPC9wcmU+CisKKyAgICA8cD5Ob3RlIHRoYXQgc3VwcG9ydCBmb3Igc2VsZi1wcm94eWluZyBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIHVzaW5nCisgICAgPGNvZGU+b3V0cHV0X2l0ZXJhdG9yX2hlbHBlcjwvY29kZT4gdG8gZWFzZSBhbnkgb3RoZXIsIGRpZmZlcmVudCBraW5kIG9mCisgICAgb3V0cHV0IGl0ZXJhdG9yJ3MgaW1wbGVtZW50YXRpb24uIElmCisgICAgPGNvZGU+b3V0cHV0X2l0ZXJhdG9yX2hlbHBlcjwvY29kZT4ncyB0YXJnZXQgdHlwZSBwcm92aWRlcyBpdHMgb3duCisgICAgZGVmaW5pdGlvbiBvZiA8Y29kZT5vcGVyYXRvcio8L2NvZGU+IG9yL2FuZCA8Y29kZT5vcGVyYXRvcisrPC9jb2RlPiwgdGhlbgorICAgIHRoZXNlIG9wZXJhdG9ycyB3aWxsIGdldCB1c2VkIGFuZCB0aGUgb25lcyBzdXBwbGllZCBieQorICAgIDxjb2RlPm91dHB1dF9pdGVyYXRvcl9oZWxwZXI8L2NvZGU+IHdpbGwgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLjwvcD4KKworICAgIDxoMz48YSBuYW1lPSJpX2RlbW8iPkl0ZXJhdG9yIERlbW9uc3RyYXRpb248L2E+IGFuZCBUZXN0IFByb2dyYW08L2gzPgorCisgICAgPHA+VGhlIDxjaXRlPjxhIGhyZWY9Iml0ZXJhdG9yc190ZXN0LmNwcCI+aXRlcmF0b3JzX3Rlc3QuY3BwPC9hPjwvY2l0ZT4KKyAgICBwcm9ncmFtIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBpdGVyYXRvciB0ZW1wbGF0ZXMsIGFuZCBjYW4gYWxzbyBiZQorICAgIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3Qgb3BlcmF0aW9uLiBUaGUgZm9sbG93aW5nIGlzIHRoZSBjdXN0b20gaXRlcmF0b3IKKyAgICBkZWZpbmVkIGluIHRoZSB0ZXN0IHByb2dyYW0uIEl0IGRlbW9uc3RyYXRlcyBhIGNvcnJlY3QgKHRob3VnaCB0cml2aWFsKQorICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb3JlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgZm9yCisgICAgdGhlIGl0ZXJhdG9yIGhlbHBlcnMgdG8gImZpbGwgaW4iIHRoZSByZXN0IG9mIHRoZSBpdGVyYXRvcgorICAgIG9wZXJhdGlvbnMuPC9wPgorCisgICAgPGJsb2NrcXVvdGU+Cis8cHJlPgordGVtcGxhdGUgJmx0O2NsYXNzIFQsIGNsYXNzIFIsIGNsYXNzIFAmZ3Q7CitzdHJ1Y3QgdGVzdF9pdGVyCisgIDogcHVibGljIGJvb3N0OjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX2hlbHBlciZsdDsKKyAgICAgdGVzdF9pdGVyJmx0O1QsUixQJmd0OywgVCwgc3RkOjpwdHJkaWZmX3QsIFAsIFImZ3Q7Cit7CisgIHR5cGVkZWYgdGVzdF9pdGVyIHNlbGY7CisgIHR5cGVkZWYgUiBSZWZlcmVuY2U7CisgIHR5cGVkZWYgc3RkOjpwdHJkaWZmX3QgRGlzdGFuY2U7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgdGVzdF9pdGVyKFQqIGkgPTApOworICB0ZXN0X2l0ZXIoY29uc3Qgc2VsZiZhbXA7IHgpOworICBzZWxmJmFtcDsgb3BlcmF0b3I9KGNvbnN0IHNlbGYmYW1wOyB4KTsKKyAgUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0OworICBzZWxmJmFtcDsgb3BlcmF0b3IrKygpOworICBzZWxmJmFtcDsgb3BlcmF0b3ItLSgpOworICBzZWxmJmFtcDsgb3BlcmF0b3IrPShEaXN0YW5jZSBuKTsKKyAgc2VsZiZhbXA7IG9wZXJhdG9yLT0oRGlzdGFuY2Ugbik7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzZWxmJmFtcDsgeCkgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3ImbHQ7KGNvbnN0IHNlbGYmYW1wOyB4KSBjb25zdDsKKyAgZnJpZW5kIERpc3RhbmNlIG9wZXJhdG9yLShjb25zdCBzZWxmJmFtcDsgeCwgY29uc3Qgc2VsZiZhbXA7IHkpOworfTsKKzwvcHJlPgorICAgIDwvYmxvY2txdW90ZT4KKworICAgIDxwPkNoZWNrIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9kZXZlbG9wbWVudC90ZXN0aW5nLmh0bWwiPmNvbXBpbGVyIHN0YXR1cworICAgIHJlcG9ydDwvYT4gZm9yIHRoZSB0ZXN0IHJlc3VsdHMgd2l0aCBzZWxlY3RlZCBwbGF0Zm9ybXMuPC9wPgorICAgIDxocj4KKworICAgIDxoMj48YSBuYW1lPSJjb250cmlidXRvcnMiPkNvbnRyaWJ1dG9yczwvYT48L2gyPgorCisgICAgPGRsPgorICAgICAgPGR0PjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL3Blb3BsZS9kYXZlX2FicmFoYW1zLmh0bSI+RGF2ZSBBYnJhaGFtczwvYT48L2R0PgorCisgICAgICA8ZGQ+U3RhcnRlZCB0aGUgbGlicmFyeSBhbmQgY29udHJpYnV0ZWQgdGhlIGFyaXRobWV0aWMgb3BlcmF0b3JzIGluCisgICAgICA8Y2l0ZT48YSBocmVmPQorICAgICAgIi4uLy4uL2Jvb3N0L29wZXJhdG9ycy5ocHAiPmJvb3N0L29wZXJhdG9ycy5ocHA8L2E+PC9jaXRlPi48L2RkPgorCisgICAgICA8ZHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2plcmVteV9zaWVrLmh0bSI+SmVyZW15IFNpZWs8L2E+PC9kdD4KKworICAgICAgPGRkPkNvbnRyaWJ1dGVkIHRoZSA8YSBocmVmPSIjZGVyZWYiPmRlcmVmZXJlbmNlIG9wZXJhdG9ycyBhbmQgaXRlcmF0b3IKKyAgICAgIGhlbHBlcnM8L2E+IGluIDxjaXRlPjxhIGhyZWY9CisgICAgICAiLi4vLi4vYm9vc3Qvb3BlcmF0b3JzLmhwcCI+Ym9vc3Qvb3BlcmF0b3JzLmhwcDwvYT48L2NpdGU+LiBBbHNvCisgICAgICBjb250cmlidXRlZCA8Y2l0ZT48YSBocmVmPQorICAgICAgIml0ZXJhdG9yc190ZXN0LmNwcCI+aXRlcmF0b3JzX3Rlc3QuY3BwPC9hPjwvY2l0ZT4uPC9kZD4KKworICAgICAgPGR0PjxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL3Blb3BsZS9hbGVrc2V5X2d1cnRvdm95Lmh0bSI+QWxla3NleQorICAgICAgR3VydG92b3k8L2E+PC9kdD4KKworICAgICAgPGRkPkNvbnRyaWJ1dGVkIHRoZSBjb2RlIHRvIHN1cHBvcnQgPGEgaHJlZj0iI2NoYWluaW5nIj5iYXNlIGNsYXNzCisgICAgICBjaGFpbmluZzwvYT4gd2hpbGUgcmVtYWluaW5nIGJhY2t3YXJkLWNvbXBhdGlibGUgd2l0aCBvbGQgdmVyc2lvbnMgb2YKKyAgICAgIHRoZSBsaWJyYXJ5LjwvZGQ+CisKKyAgICAgIDxkdD48YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9wZW9wbGUvYmVtYW5fZGF3ZXMuaHRtbCI+QmVtYW4gRGF3ZXM8L2E+PC9kdD4KKworICAgICAgPGRkPkNvbnRyaWJ1dGVkIDxjaXRlPjxhIGhyZWY9CisgICAgICAib3BlcmF0b3JzX3Rlc3QuY3BwIj5vcGVyYXRvcnNfdGVzdC5jcHA8L2E+PC9jaXRlPi48L2RkPgorCisgICAgICA8ZHQ+PGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvcGVvcGxlL2RhcnlsZV93YWxrZXIuaHRtbCI+RGFyeWxlIFdhbGtlcjwvYT48L2R0PgorCisgICAgICA8ZGQ+Q29udHJpYnV0ZWQgY2xhc3NlcyBmb3IgdGhlIHNoaWZ0IG9wZXJhdG9ycywgZXF1aXZhbGVuY2UsIHBhcnRpYWwKKyAgICAgIG9yZGVyaW5nLCBhbmQgYXJpdGhtZXRpYyBjb252ZXJzaW9ucy4gQWRkZWQgdGhlIGdyb3VwZWQgb3BlcmF0b3IKKyAgICAgIGNsYXNzZXMuIEFkZGVkIGhlbHBlciBjbGFzc2VzIGZvciBpbnB1dCBhbmQgb3V0cHV0IGl0ZXJhdG9ycy48L2RkPgorCisgICAgICA8ZHQ+SGVsbXV0IFplaXNlbDwvZHQ+CisKKyAgICAgIDxkZD5Db250cmlidXRlZCB0aGUgJ2xlZnQnIG9wZXJhdG9ycyBhbmQgYWRkZWQgc29tZSBncm91cGVkIG9wZXJhdG9yCisgICAgICBjbGFzc2VzLjwvZGQ+CisKKyAgICAgIDxkdD5EYW5pZWwgRnJleTwvZHQ+CisKKyAgICAgIDxkZD5Db250cmlidXRlZCB0aGUgTlJWTy1mcmllbmRseSBhbmQgc3ltbWV0cmljIGltcGxlbWVudGF0aW9uIG9mCisgICAgICBhcml0aG1ldGljIG9wZXJhdG9ycy48L2RkPgorCisgICAgPC9kbD4KKworICAgIDxoMj5Ob3RlIGZvciBVc2VycyBvZiA8YSBuYW1lPSJvbGRfbGliX25vdGUiPk9sZGVyIFZlcnNpb25zPC9hPjwvaDI+CisKKyAgICA8cD5UaGUgPGEgaHJlZj0iI2NoYWluaW5nIj5jaGFuZ2VzIGluIHRoZSBsaWJyYXJ5IGludGVyZmFjZSBhbmQKKyAgICByZWNvbW1lbmRlZCB1c2FnZTwvYT4gd2VyZSBtb3RpdmF0ZWQgYnkgc29tZSBwcmFjdGljYWwgaXNzdWVzIGRlc2NyaWJlZAorICAgIGJlbG93LiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgaXMgc3RpbGwgYmFja3dhcmQtY29tcGF0aWJsZSB3aXRoCisgICAgdGhlIGZvcm1lciBvbmUgKHNvIHlvdSdyZSBub3QgPGVtPmZvcmNlZDwvZW0+IGNoYW5nZSBhbnkgZXhpc3RpbmcgY29kZSksCisgICAgYnV0IHRoZSBvbGQgdXNhZ2UgaXMgZGVwcmVjYXRlZC4gVGhvdWdoIGl0IHdhcyBhcmd1YWJseSBzaW1wbGVyIGFuZCBtb3JlCisgICAgaW50dWl0aXZlIHRoYW4gdXNpbmcgPGEgaHJlZj0iI2NoYWluaW5nIj5iYXNlIGNsYXNzIGNoYWluaW5nPC9hPiwgaXQgaGFzCisgICAgYmVlbiBkaXNjb3ZlcmVkIHRoYXQgdGhlIG9sZCBwcmFjdGljZSBvZiBkZXJpdmluZyBmcm9tIG11bHRpcGxlIG9wZXJhdG9yCisgICAgdGVtcGxhdGVzIGNhbiBjYXVzZSB0aGUgcmVzdWx0aW5nIGNsYXNzZXMgdG8gYmUgbXVjaCBsYXJnZXIgdGhhbiB0aGV5CisgICAgc2hvdWxkIGJlLiBNb3N0IG1vZGVybiBDKysgY29tcGlsZXJzIHNpZ25pZmljYW50bHkgYmxvYXQgdGhlIHNpemUgb2YKKyAgICBjbGFzc2VzIGRlcml2ZWQgZnJvbSBtdWx0aXBsZSBlbXB0eSBiYXNlIGNsYXNzZXMsIGV2ZW4gdGhvdWdoIHRoZSBiYXNlCisgICAgY2xhc3NlcyB0aGVtc2VsdmVzIGhhdmUgbm8gc3RhdGUuIEZvciBpbnN0YW5jZSwgdGhlIHNpemUgb2YKKyAgICA8Y29kZT5wb2ludCZsdDtpbnQmZ3Q7PC9jb2RlPiBmcm9tIHRoZSA8YSBocmVmPSIjZXhhbXBsZSI+ZXhhbXBsZTwvYT4KKyAgICBhYm92ZSB3YXMgMTItMjQgYnl0ZXMgb24gdmFyaW91cyBjb21waWxlcnMgZm9yIHRoZSBXaW4zMiBwbGF0Zm9ybSwKKyAgICBpbnN0ZWFkIG9mIHRoZSBleHBlY3RlZCA4IGJ5dGVzLjwvcD4KKworICAgIDxwPlN0cmljdGx5IHNwZWFraW5nLCBpdCB3YXMgbm90IHRoZSBsaWJyYXJ5J3MgZmF1bHQtLXRoZSBsYW5ndWFnZSBydWxlcworICAgIGFsbG93IHRoZSBjb21waWxlciB0byBhcHBseSB0aGUgZW1wdHkgYmFzZSBjbGFzcyBvcHRpbWl6YXRpb24gaW4gdGhhdAorICAgIHNpdHVhdGlvbi4gSW4gcHJpbmNpcGxlIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZW1wdHkgYmFzZSBjbGFzc2VzIGNhbiBiZQorICAgIGFsbG9jYXRlZCBhdCB0aGUgc2FtZSBvZmZzZXQsIHByb3ZpZGVkIHRoYXQgbm9uZSBvZiB0aGVtIGhhdmUgYSBjb21tb24KKyAgICBhbmNlc3RvciAoc2VlIHNlY3Rpb24gMTAuNSBbY2xhc3MuZGVyaXZlZF0gcGFyYWdyYXBoIDUgb2YgdGhlIHN0YW5kYXJkKS4KKyAgICBCdXQgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gYWxzbyBkb2Vzbid0IDxlbT5yZXF1aXJlPC9lbT4gaW1wbGVtZW50YXRpb25zCisgICAgdG8gZG8gdGhlIG9wdGltaXphdGlvbiwgYW5kIGZldyBpZiBhbnkgb2YgdG9kYXkncyBjb21waWxlcnMgaW1wbGVtZW50IGl0CisgICAgd2hlbiBtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBpbnZvbHZlZC4gV2hhdCdzIHdvcnNlLCBpdCBpcyB2ZXJ5IHVubGlrZWx5CisgICAgdGhhdCBpbXBsZW1lbnRvcnMgd2lsbCBhZG9wdCBpdCBhcyBhIGZ1dHVyZSBlbmhhbmNlbWVudCB0byBleGlzdGluZworICAgIGNvbXBpbGVycywgYmVjYXVzZSBpdCB3b3VsZCBicmVhayBiaW5hcnkgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGNvZGUKKyAgICBnZW5lcmF0ZWQgYnkgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBjb21waWxlci4gQXMgTWF0dCBBdXN0ZXJuCisgICAgc2FpZCwgIk9uZSBvZiB0aGUgZmV3IHRpbWVzIHdoZW4geW91IGhhdmUgdGhlIGZyZWVkb20gdG8gZG8gdGhpcyBzb3J0IG9mCisgICAgdGhpbmcgaXMgd2hlbiB5b3UncmUgdGFyZ2V0aW5nIGEgbmV3IGFyY2hpdGVjdHVyZS4uLiIuIE9uIHRoZSBvdGhlciBoYW5kLAorICAgIG1hbnkgY29tbW9uIGNvbXBpbGVycyB3aWxsIHVzZSB0aGUgZW1wdHkgYmFzZSBvcHRpbWl6YXRpb24gZm9yIHNpbmdsZQorICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLjwvcD4KKworICAgIDxwPkdpdmVuIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBpc3N1ZSBmb3IgdGhlIHVzZXJzIG9mIHRoZSBsaWJyYXJ5ICh3aGljaAorICAgIGFpbXMgdG8gYmUgdXNlZnVsIGZvciB3cml0aW5nIGxpZ2h0LXdlaWdodCBjbGFzc2VzIGxpa2UKKyAgICA8Y29kZT5NeUludDwvY29kZT4gb3IgPGNvZGU+cG9pbnQmbHQ7Jmd0OzwvY29kZT4pLCBhbmQgdGhlIGZvcmNlcworICAgIGRlc2NyaWJlZCBhYm92ZSwgd2UgZGVjaWRlZCB0byBjaGFuZ2UgdGhlIGxpYnJhcnkgaW50ZXJmYWNlIHNvIHRoYXQgdGhlCisgICAgb2JqZWN0IHNpemUgYmxvYXQgY291bGQgYmUgZWxpbWluYXRlZCBldmVuIG9uIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgb25seQorICAgIHRoZSBzaW1wbGVzdCBmb3JtIG9mIHRoZSBlbXB0eSBiYXNlIGNsYXNzIG9wdGltaXphdGlvbi4gVGhlIGN1cnJlbnQKKyAgICBsaWJyYXJ5IGludGVyZmFjZSBpcyB0aGUgcmVzdWx0IG9mIHRob3NlIGNoYW5nZXMuIFRob3VnaCB0aGUgbmV3IHVzYWdlIGlzCisgICAgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBvbGQgb25lLCB3ZSB0aGluayBpdCdzIHdvcnRoIGl0IHRvIG1ha2UKKyAgICB0aGUgbGlicmFyeSBtb3JlIHVzZWZ1bCBpbiByZWFsIHdvcmxkLiBBbGV4eSBHdXJ0b3ZveSBjb250cmlidXRlZCB0aGUKKyAgICBjb2RlIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXcgdXNhZ2UgaWRpb20gd2hpbGUgYWxsb3dpbmcgdGhlIGxpYnJhcnkgcmVtYWluCisgICAgYmFja3dhcmQtY29tcGF0aWJsZS48L3A+CisgICAgPGhyPgorCisgICAgPHA+UmV2aXNlZDogNyBBdWcgMjAwODwvcD4KKworICAgIDxwPkNvcHlyaWdodCAmY29weTsgQmVtYW4gRGF3ZXMsIERhdmlkIEFicmFoYW1zLCAxOTk5LTIwMDEuPC9wPgorICAgIDxwPkNvcHlyaWdodCAmY29weTsgRGFuaWVsIEZyZXksIDIwMDItMjAwOS48L3A+CisgICAgPHA+VXNlLCBtb2RpZmljYXRpb24sIGFuZCBkaXN0cmlidXRpb24gaXMgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUKKyAgICBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZQorICAgIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+TElDRU5TRV8xXzAudHh0PC9hPiBvciBjb3B5IGF0CisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij4KKyAgICB3d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9wPgorICA8L2JvZHk+Cis8L2h0bWw+CisKZGlmZiAtLWdpdCBhL3N1YmxpYnMgYi9zdWJsaWJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMWQ3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zdWJsaWJzCkBAIC0wLDAgKzEgQEAKK1RoZSBleGlzdGFuY2Ugb2YgdGhpcyBmaWxlIHRlbGxzIHRoZSByZWdyZXNzaW9uIHJlcG9ydGluZyBwcm9ncmFtcyB0aGF0IHRoZSBkaXJlY3RvcnkgY29udGFpbnMgc3ViLWRpcmVjdG9yaWVzIHdoaWNoIGFyZSBsaWJyYXJpZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9KYW1maWxlLnYyIGIvdGVzdC9KYW1maWxlLnYyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDViMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phbWZpbGUudjIKQEAgLTAsMCArMSw0MyBAQAorIyBDb3B5cmlnaHQgRGF2aWQgQWJyYWhhbXMgMjAwMy4KKworIyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCisjIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQKKworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnLworCisjIGJyaW5nIGluIHJ1bGVzIGZvciB0ZXN0aW5nCitpbXBvcnQgdGVzdGluZyA7CisKK3J1biBiYXNlX2Zyb21fbWVtYmVyX3Rlc3QuY3BwIDsKK3J1biBiYXNlX2Zyb21fbWVtYmVyX3JlZl90ZXN0LmNwcCA7CisKK3J1biBiaW5hcnlfdGVzdC5jcHAgOworCitydW4gY2FsbF90cmFpdHNfdGVzdC5jcHAgOiAtdSA7CisKK3J1biBjb21wcmVzc2VkX3BhaXJfdGVzdC5jcHAgOworCitydW4gaXRlcmF0b3JzX3Rlc3QuY3BwIDsKKworcnVuIG9wZXJhdG9yc190ZXN0LmNwcCA7CisKK2NvbXBpbGUgcmVzdWx0X29mX3Rlc3QuY3BwIDsKKworIyBjb21waWxlLWZhaWwgc3RyaW5nX3JlZl9mcm9tX3J2YWx1ZS5jcHAgOworcnVuIHN0cmluZ19yZWZfdGVzdDEuY3BwIDsKK3J1biBzdHJpbmdfcmVmX3Rlc3QyLmNwcCA7CitydW4gc3RyaW5nX3JlZl90ZXN0X2lvLmNwcCA7CisjIGNvbXBpbGUtZmFpbCBzdHJpbmdfdmlld19mcm9tX3J2YWx1ZS5jcHAgOworY29tcGlsZSBzdHJpbmdfdmlld19jb25zdGV4cHJfdGVzdDEuY3BwIDsKK3J1biBzdHJpbmdfdmlld190ZXN0MS5jcHAgOworcnVuIHN0cmluZ192aWV3X3Rlc3QyLmNwcCA7CitydW4gc3RyaW5nX3ZpZXdfdGVzdF9pby5jcHAgOworCitydW4gdmFsdWVfaW5pdF90ZXN0LmNwcCA7CitydW4gdmFsdWVfaW5pdF93b3JrYXJvdW5kX3Rlc3QuY3BwIDsKK3J1biBpbml0aWFsaXplZF90ZXN0LmNwcCA7Citjb21waWxlLWZhaWwgdmFsdWVfaW5pdF90ZXN0X2ZhaWwxLmNwcCA7Citjb21waWxlLWZhaWwgdmFsdWVfaW5pdF90ZXN0X2ZhaWwyLmNwcCA7Citjb21waWxlLWZhaWwgdmFsdWVfaW5pdF90ZXN0X2ZhaWwzLmNwcCA7Citjb21waWxlLWZhaWwgaW5pdGlhbGl6ZWRfdGVzdF9mYWlsMS5jcHAgOworY29tcGlsZS1mYWlsIGluaXRpYWxpemVkX3Rlc3RfZmFpbDIuY3BwIDsKZGlmZiAtLWdpdCBhL3Rlc3QvYmFzZV9mcm9tX21lbWJlcl9yZWZfdGVzdC5jcHAgYi90ZXN0L2Jhc2VfZnJvbV9tZW1iZXJfcmVmX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjliODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Jhc2VfZnJvbV9tZW1iZXJfcmVmX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vCisvLyBUZXN0IHRoYXQgYSBiYXNlX2Zyb21fbWVtYmVyPFQmPiBjYW4gYmUgcHJvcGVybHkgY29uc3RydWN0ZWQKKy8vCisvLyBDb3B5cmlnaHQgMjAxNCBBZ3VzdGluIEJlcmdlCisvLworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQKKy8vCisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L2Jhc2VfZnJvbV9tZW1iZXIuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKworc3RydWN0IGZvbyA6IGJvb3N0OjpiYXNlX2Zyb21fbWVtYmVyPGludCY+Cit7CisgICAgZXhwbGljaXQgZm9vKGludCYgcmVmKSA6IGJvb3N0OjpiYXNlX2Zyb21fbWVtYmVyPGludCY+KHJlZikKKyAgICB7CisgICAgICAgIEJPT1NUX1RFU1QoJm1lbWJlciA9PSAmcmVmKTsKKyAgICB9Cit9OworCitpbnQgbWFpbigpCit7CisgICAgaW50IGkgPSAwOworICAgIGZvbyBmKGkpOworCisgICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Jhc2VfZnJvbV9tZW1iZXJfdGVzdC5jcHAgYi90ZXN0L2Jhc2VfZnJvbV9tZW1iZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1YzYzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYmFzZV9mcm9tX21lbWJlcl90ZXN0LmNwcApAQCAtMCwwICsxLDU5MyBAQAorLy8gIEJvb3N0IHRlc3QgcHJvZ3JhbSBmb3IgYmFzZS1mcm9tLW1lbWJlciBjbGFzcyB0ZW1wbGF0ZXMgIC0tLS0tLS0tLS0tLS0tLS0tLy8KKworLy8gIENvcHlyaWdodCAyMDAxLCAyMDAzIERhcnlsZSBXYWxrZXIuICBVc2UsIG1vZGlmaWNhdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBhcmUKKy8vICBzdWJqZWN0IHRvIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gIChTZWUgYWNjb21wYW55aW5nIGZpbGUKKy8vICBMSUNFTlNFXzFfMC50eHQgb3IgYSBjb3B5IGF0IDxodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ+LikKKworLy8gIFNlZSA8aHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy91dGlsaXR5Lz4gZm9yIHRoZSBsaWJyYXJ5J3MgaG9tZSBwYWdlLgorCisvLyAgUmV2aXNpb24gSGlzdG9yeQorLy8gIDE0IEp1biAyMDAzICBBZGp1c3RlZCBjb2RlIGZvciBCb29zdC5UZXN0IGNoYW5nZXMgKERhcnlsZSBXYWxrZXIpCisvLyAgMjkgQXVnIDIwMDEgIEluaXRpYWwgVmVyc2lvbiAoRGFyeWxlIFdhbGtlcikKKworI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPiAgICAgICAvLyBmb3IgQk9PU1RfTk9fTUVNQkVSX1RFTVBMQVRFUworI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4gIC8vIGZvciBib29zdDo6bm9uY29weWFibGUKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvYmFzZV9mcm9tX21lbWJlci5ocHA+ICAvLyBmb3IgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+ICAvLyBmb3Igc3RkOjpsZXNzCisjaW5jbHVkZSA8aW9zdHJlYW0+ICAgIC8vIGZvciBzdGQ6OmNvdXQgKHN0ZDo6b3N0cmVhbSwgc3RkOjplbmRsIGluZGlyZWN0bHkpCisjaW5jbHVkZSA8c2V0PiAgICAgICAgIC8vIGZvciBzdGQ6OnNldAorI2luY2x1ZGUgPHR5cGVpbmZvPiAgICAvLyBmb3Igc3RkOjp0eXBlX2luZm8KKyNpbmNsdWRlIDx1dGlsaXR5PiAgICAgLy8gZm9yIHN0ZDo6cGFpciwgc3RkOjptYWtlX3BhaXIKKyNpbmNsdWRlIDx2ZWN0b3I+ICAgICAgLy8gZm9yIHN0ZDo6dmVjdG9yCisKKworLy8gQ29udHJvbCBpZiBleHRyYSBpbmZvcm1hdGlvbiBpcyBwcmludGVkCisjaWZuZGVmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyNkZWZpbmUgQ09OVFJPTF9FWFRSQV9QUklOVElORyAgMQorI2VuZGlmCisKKworLy8gQSAoc3ViKW9iamVjdCBjYW4gYmUgaWRlbnRpZmllZCBieSBpdHMgbWVtb3J5IGxvY2F0aW9uIGFuZCBpdHMgdHlwZS4KKy8vIEJvdGggYXJlIG5lZWRlZCBzaW5jZSBhbiBvYmplY3QgY2FuIHN0YXJ0IGF0IHRoZSBzYW1lIHBsYWNlIGFzIGl0cworLy8gZmlyc3QgYmFzZSBjbGFzcyBzdWJvYmplY3QgYW5kL29yIGNvbnRhaW5lZCBzdWJvYmplY3QuCit0eXBlZGVmIHN0ZDo6cGFpcjwgdm9pZCAqLCBzdGQ6OnR5cGVfaW5mbyBjb25zdCAqID4gIG9iamVjdF9pZDsKKworLy8gT2JqZWN0IElEcyBuZWVkIHRvIGJlIHByaW50ZWQKK3N0ZDo6b3N0cmVhbSAmICBvcGVyYXRvciA8PCggc3RkOjpvc3RyZWFtICZvcywgb2JqZWN0X2lkIGNvbnN0ICZvaSApOworCisvLyBBIHdheSB0byBnZW5lcmF0ZSBhbiBvYmplY3QgSUQKK3RlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgIG9iamVjdF9pZCAgaWRlbnRpZnkoIFQgJm9iaiApOworCisvLyBBIGN1c3RvbSBjb21wYXJpc29uIHR5cGUgaXMgbmVlZGVkCitzdHJ1Y3Qgb2JqZWN0X2lkX2NvbXBhcmUKK3sKKyAgICBib29sICBvcGVyYXRvciAoKSggb2JqZWN0X2lkIGNvbnN0ICZhLCBvYmplY3RfaWQgY29uc3QgJmIgKSBjb25zdDsKKworfTsgIC8vIG9iamVjdF9pZF9jb21wYXJlCisKKy8vIEEgc2luZ2xldG9uIG9mIHRoaXMgdHlwZSBjb29yZGluYXRlcyB0aGUgYWNrbm93bGVkZ2VtZW50cworLy8gb2Ygb2JqZWN0cyBiZWluZyBjcmVhdGVkIGFuZCB1c2VkLgorY2xhc3Mgb2JqZWN0X3JlZ2lzdHJhcgorICAgIDogcHJpdmF0ZSBib29zdDo6bm9uY29weWFibGUKK3sKK3B1YmxpYzoKKworICAgICNpZm5kZWYgQk9PU1RfTk9fTUVNQkVSX1RFTVBMQVRFUworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgICAgIHZvaWQgIHJlZ2lzdGVyX29iamVjdCggVCAmb2JqICkKKyAgICAgICAgICAgIHsgdGhpcy0+cmVnaXN0ZXJfb2JqZWN0X2ltcCggaWRlbnRpZnkob2JqKSApOyB9CisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVID4KKyAgICAgICAgdm9pZCAgcmVnaXN0ZXJfdXNlKCBUICZvd25lciwgVSAmb3duZWQgKQorICAgICAgICAgICAgeyB0aGlzLT5yZWdpc3Rlcl91c2VfaW1wKCBpZGVudGlmeShvd25lciksIGlkZW50aWZ5KG93bmVkKSApOyB9CisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVID4KKyAgICAgICAgdm9pZCAgdW5yZWdpc3Rlcl91c2UoIFQgJm93bmVyLCBVICZvd25lZCApCisgICAgICAgICAgICB7IHRoaXMtPnVucmVnaXN0ZXJfdXNlX2ltcCggaWRlbnRpZnkob3duZXIpLCBpZGVudGlmeShvd25lZCkgKTsgfQorICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgICAgIHZvaWQgIHVucmVnaXN0ZXJfb2JqZWN0KCBUICZvYmogKQorICAgICAgICAgICAgeyB0aGlzLT51bnJlZ2lzdGVyX29iamVjdF9pbXAoIGlkZW50aWZ5KG9iaikgKTsgfQorICAgICNlbmRpZgorCisgICAgdm9pZCAgcmVnaXN0ZXJfb2JqZWN0X2ltcCggb2JqZWN0X2lkIG9iaiApOworICAgIHZvaWQgIHJlZ2lzdGVyX3VzZV9pbXAoIG9iamVjdF9pZCBvd25lciwgb2JqZWN0X2lkIG93bmVkICk7CisgICAgdm9pZCAgdW5yZWdpc3Rlcl91c2VfaW1wKCBvYmplY3RfaWQgb3duZXIsIG9iamVjdF9pZCBvd25lZCApOworICAgIHZvaWQgIHVucmVnaXN0ZXJfb2JqZWN0X2ltcCggb2JqZWN0X2lkIG9iaiApOworCisgICAgdHlwZWRlZiBzdGQ6OnNldDxvYmplY3RfaWQsIG9iamVjdF9pZF9jb21wYXJlPiAgc2V0X3R5cGU7CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPG9iamVjdF9pZD4gIGVycm9yX3JlY29yZF90eXBlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8IHN0ZDo6cGFpcjxvYmplY3RfaWQsIG9iamVjdF9pZD4gPiAgZXJyb3JfcGFpcl90eXBlOworCisgICAgc2V0X3R5cGUgIGRiXzsKKworICAgIGVycm9yX3BhaXJfdHlwZSAgICBkZWZyYXVkZXJzX2luXywgZGVmcmF1ZGVyc19vdXRfOworICAgIGVycm9yX3JlY29yZF90eXBlICBvdmVyZWFnZXJfLCBvdmVya2lsbGVkXzsKKworfTsgIC8vIG9iamVjdF9yZWdpc3RyYXIKKworLy8gQSBzYW1wbGUgdHlwZSB0byBiZSB1c2VkIGJ5IGNvbnRhaW5pbmcgdHlwZXMKK2NsYXNzIGJhc2Vfb3JfbWVtYmVyCit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgIGJhc2Vfb3JfbWVtYmVyKCBpbnQgeCA9IDEsIGRvdWJsZSB5ID0gLTAuMjUgKTsKKyAgICAgICAgICAgICB+YmFzZV9vcl9tZW1iZXIoKTsKKworfTsgIC8vIGJhc2Vfb3JfbWVtYmVyCisKKy8vIEEgc2FtcGxlIHR5cGUgdGhhdCB1c2VzIGJhc2Vfb3JfbWVtYmVyLCB1c2VkCisvLyBhcyBhIGJhc2UgZm9yIHRoZSBtYWluIGRlbW9uc3RyYXRpb24gY2xhc3NlcworY2xhc3MgYmFzZV9jbGFzcworeworcHVibGljOgorICAgIGV4cGxpY2l0ICBiYXNlX2NsYXNzKCBiYXNlX29yX21lbWJlciAmeCwgYmFzZV9vcl9tZW1iZXIgKnkgPSAwLAorICAgICBiYXNlX29yX21lbWJlciAqeiA9IDAgKTsKKworICAgIH5iYXNlX2NsYXNzKCk7CisKK3ByaXZhdGU6CisgICAgYmFzZV9vcl9tZW1iZXIgICp4XywgKnlfLCAqel87CisKK307ICAvLyBiYXNlX2NsYXNzCisKKy8vIFRoaXMgYmFkIGNsYXNzIGRlbW9uc3RyYXRlcyB0aGUgZGlyZWN0IG1ldGhvZCBvZiBhIGJhc2UgY2xhc3MgbmVlZGluZworLy8gdG8gYmUgaW5pdGlhbGl6ZWQgYnkgYSBtZW1iZXIuICBUaGlzIGlzIGltcHJvcGVyIHNpbmNlIHRoZSBtZW1iZXIKKy8vIGlzbid0IGluaXRpYWxpemVkIHVudGlsIGFmdGVyIHRoZSBiYXNlIGNsYXNzLgorY2xhc3MgYmFkX2NsYXNzCisgICAgOiBwdWJsaWMgYmFzZV9jbGFzcworeworcHVibGljOgorICAgICBiYWRfY2xhc3MoKTsKKyAgICB+YmFkX2NsYXNzKCk7CisKK3ByaXZhdGU6CisgICAgYmFzZV9vcl9tZW1iZXIgIHhfOworCit9OyAgLy8gYmFkX2NsYXNzCisKKy8vIFRoZSBmaXJzdCBnb29kIGNsYXNzIGRlbW9uc3RyYXRlcyB0aGUgY29ycmVjdCB3YXkgdG8gaW5pdGlhbGl6ZSBhCisvLyBiYXNlIGNsYXNzIHdpdGggYSBtZW1iZXIuICBUaGUgbWVtYmVyIGlzIGNoYW5nZWQgdG8gYW5vdGhlciBiYXNlCisvLyBjbGFzcywgb25lIHRoYXQgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBiYXNlIHRoYXQgbmVlZHMgaXQuCitjbGFzcyBnb29kX2NsYXNzXzEKKyAgICA6IHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8YmFzZV9vcl9tZW1iZXI+CisgICAgLCBwdWJsaWMgYmFzZV9jbGFzcworeworICAgIHR5cGVkZWYgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8YmFzZV9vcl9tZW1iZXI+ICBwYmFzZV90eXBlOworICAgIHR5cGVkZWYgYmFzZV9jbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV90eXBlOworCitwdWJsaWM6CisgICAgIGdvb2RfY2xhc3NfMSgpOworICAgIH5nb29kX2NsYXNzXzEoKTsKKworfTsgIC8vIGdvb2RfY2xhc3NfMQorCisvLyBUaGUgc2Vjb25kIGdvb2QgY2xhc3MgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIGNvcnJlY3Qgd2F5IHRvIGluaXRpYWxpemUKKy8vIGJhc2UgY2xhc3NlcyB3aXRoIG90aGVyIHN1Ym9iamVjdHMuICBUaGlzIGNsYXNzIHVzZXMgdGhlIG90aGVyIGhlbHBlcnMKKy8vIGluIHRoZSBsaWJyYXJ5LCBhbmQgc2hvd3MgdGhlIHRlY2huaXF1ZSBvZiB1c2luZyB0d28gYmFzZSBzdWJvYmplY3RzCisvLyBvZiB0aGUgInNhbWUiIHR5cGUuCitjbGFzcyBnb29kX2NsYXNzXzIKKyAgICA6IHByaXZhdGUgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8YmFzZV9vcl9tZW1iZXIsIDA+CisgICAgLCBwcml2YXRlIGJvb3N0OjpiYXNlX2Zyb21fbWVtYmVyPGJhc2Vfb3JfbWVtYmVyLCAxPgorICAgICwgcHJpdmF0ZSBib29zdDo6YmFzZV9mcm9tX21lbWJlcjxiYXNlX29yX21lbWJlciwgMj4KKyAgICAsIHB1YmxpYyBiYXNlX2NsYXNzCit7CisgICAgdHlwZWRlZiBib29zdDo6YmFzZV9mcm9tX21lbWJlcjxiYXNlX29yX21lbWJlciwgMD4gIHBiYXNlX3R5cGUwOworICAgIHR5cGVkZWYgYm9vc3Q6OmJhc2VfZnJvbV9tZW1iZXI8YmFzZV9vcl9tZW1iZXIsIDE+ICBwYmFzZV90eXBlMTsKKyAgICB0eXBlZGVmIGJvb3N0OjpiYXNlX2Zyb21fbWVtYmVyPGJhc2Vfb3JfbWVtYmVyLCAyPiAgcGJhc2VfdHlwZTI7CisgICAgdHlwZWRlZiBiYXNlX2NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX3R5cGU7CisKK3B1YmxpYzoKKyAgICAgZ29vZF9jbGFzc18yKCk7CisgICAgfmdvb2RfY2xhc3NfMigpOworCit9OyAgLy8gZ29vZF9jbGFzc18yCisKKy8vIERlY2xhcmUvZGVmaW5lIHRoZSBzaW5nbGUgb2JqZWN0IHJlZ2lzdHJhcgorb2JqZWN0X3JlZ2lzdHJhciAgb2JqX3JlZzsKKworCisvLyBNYWluIGZ1bmN0aW9uYWxpdHkKK2ludAorbWFpbigpCit7CisgICAgQk9PU1RfVEVTVCggb2JqX3JlZy5kYl8uZW1wdHkoKSApOworICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGVmcmF1ZGVyc19pbl8uZW1wdHkoKSApOworICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGVmcmF1ZGVyc19vdXRfLmVtcHR5KCkgKTsKKyAgICBCT09TVF9URVNUKCBvYmpfcmVnLm92ZXJlYWdlcl8uZW1wdHkoKSApOworICAgIEJPT1NUX1RFU1QoIG9ial9yZWcub3ZlcmtpbGxlZF8uZW1wdHkoKSApOworCisgICAgLy8gTWFrZSBhIHNlcGFyYXRlIGJsb2NrIHRvIGV4YW1pbmUgcHJlLSBhbmQgcG9zdC1lZmZlY3RzCisgICAgeworICAgICAgICB1c2luZyBzdGQ6OmNvdXQ7CisgICAgICAgIHVzaW5nIHN0ZDo6ZW5kbDsKKworICAgICAgICBiYWRfY2xhc3MgIGJjOworICAgICAgICBCT09TVF9URVNUKCBvYmpfcmVnLmRiXy5zaXplKCkgPT0gMyApOworICAgICAgICBCT09TVF9URVNUKCBvYmpfcmVnLmRlZnJhdWRlcnNfaW5fLnNpemUoKSA9PSAxICk7CisKKyAgICAgICAgZ29vZF9jbGFzc18xICBnYzE7CisgICAgICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGJfLnNpemUoKSA9PSA2ICk7CisgICAgICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGVmcmF1ZGVyc19pbl8uc2l6ZSgpID09IDEgKTsKKworICAgICAgICBnb29kX2NsYXNzXzIgIGdjMjsKKyAgICAgICAgQk9PU1RfVEVTVCggb2JqX3JlZy5kYl8uc2l6ZSgpID09IDExICk7CisgICAgICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGVmcmF1ZGVyc19pbl8uc2l6ZSgpID09IDEgKTsKKworICAgICAgICBCT09TVF9URVNUKCBvYmpfcmVnLmRlZnJhdWRlcnNfb3V0Xy5lbXB0eSgpICk7CisgICAgICAgIEJPT1NUX1RFU1QoIG9ial9yZWcub3ZlcmVhZ2VyXy5lbXB0eSgpICk7CisgICAgICAgIEJPT1NUX1RFU1QoIG9ial9yZWcub3ZlcmtpbGxlZF8uZW1wdHkoKSApOworCisgICAgICAgIC8vIEdldHRpbmcgdGhlIGFkZHJlc3NlcyBvZiB0aGUgb2JqZWN0cyBlbnN1cmUKKyAgICAgICAgLy8gdGhhdCB0aGV5J3JlIHVzZWQsIGFuZCBub3Qgb3B0aW1pemVkIGF3YXkuCisgICAgICAgIGNvdXQgPDwgIk9iamVjdCAnYmMnIGlzIGF0ICIgPDwgJmJjIDw8ICcuJyA8PCBlbmRsOworICAgICAgICBjb3V0IDw8ICJPYmplY3QgJ2djMScgaXMgYXQgIiA8PCAmZ2MxIDw8ICcuJyA8PCBlbmRsOworICAgICAgICBjb3V0IDw8ICJPYmplY3QgJ2djMicgaXMgYXQgIiA8PCAmZ2MyIDw8ICcuJyA8PCBlbmRsOworICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9ial9yZWcuZGJfLmVtcHR5KCkgKTsKKyAgICBCT09TVF9URVNUKCBvYmpfcmVnLmRlZnJhdWRlcnNfaW5fLnNpemUoKSA9PSAxICk7CisgICAgQk9PU1RfVEVTVCggb2JqX3JlZy5kZWZyYXVkZXJzX291dF8uc2l6ZSgpID09IDEgKTsKKyAgICBCT09TVF9URVNUKCBvYmpfcmVnLm92ZXJlYWdlcl8uZW1wdHkoKSApOworICAgIEJPT1NUX1RFU1QoIG9ial9yZWcub3ZlcmtpbGxlZF8uZW1wdHkoKSApOworCisgICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CisKKworLy8gUHJpbnQgYW4gb2JqZWN0J3MgSUQKK3N0ZDo6b3N0cmVhbSAmCitvcGVyYXRvciA8PAorKAorICAgIHN0ZDo6b3N0cmVhbSAmICAgICBvcywKKyAgICBvYmplY3RfaWQgY29uc3QgJiAgb2kKKykKK3sKKyAgICAvLyBJIGhhZCBhbiBzdGQ6Om9zdHJpbmdzdHJlYW0gdG8gaGVscCwgYnV0IEkgZGlkIG5vdCBuZWVkIGl0IHNpbmNlCisgICAgLy8gdGhlIHByb2dyYW0gbmV2ZXIgc2NyZXdzIGFyb3VuZCB3aXRoIGZvcm1hdHRpbmcuICBXb3JzZSwgdXNpbmcKKyAgICAvLyBzdGQ6Om9zdHJpbmdzdHJlYW0gaXMgYW4gaXNzdWUgd2l0aCBzb21lIGNvbXBpbGVycy4KKworICAgIHJldHVybiBvcyA8PCAnWycgPDwgKCBvaS5zZWNvbmQgPyBvaS5zZWNvbmQtPm5hbWUoKSA6ICJOT1RISU5HIiApCisgICAgIDw8ICIgYXQgIiA8PCBvaS5maXJzdCA8PCAnXSc7Cit9CisKKy8vIEdldCBhbiBvYmplY3QgSUQgZ2l2ZW4gYW4gb2JqZWN0Cit0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgoraW5saW5lCitvYmplY3RfaWQKK2lkZW50aWZ5CisoCisgICAgVCAmICBvYmoKKykKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoIHN0YXRpY19jYXN0PHZvaWQgKj4oJm9iaiksICYodHlwZWlkKCBvYmogKSkgKTsKK30KKworLy8gQ29tcGFyZSB0d28gb2JqZWN0IElEcworYm9vbAorb2JqZWN0X2lkX2NvbXBhcmU6Om9wZXJhdG9yICgpCisoCisgICAgb2JqZWN0X2lkIGNvbnN0ICYgIGEsCisgICAgb2JqZWN0X2lkIGNvbnN0ICYgIGIKKykgY29uc3QKK3sKKyAgICBzdGQ6Omxlc3M8dm9pZCAqPiAgdnBfY21wOworICAgIGlmICggdnBfY21wKGEuZmlyc3QsIGIuZmlyc3QpICkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICggdnBfY21wKGIuZmlyc3QsIGEuZmlyc3QpICkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gb2JqZWN0IHBvaW50ZXJzIGFyZSBlcXVhbCwgY29tcGFyZSB0aGUgdHlwZXMKKyAgICAgICAgaWYgKCBhLnNlY29uZCA9PSBiLnNlY29uZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggIWEuc2Vjb25kICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgLy8gTlVMTCBwcmVjZWVkcyBhbnl0aGluZyBlbHNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICFiLnNlY29uZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIE5VTEwgcHJlY2VlZHMgYW55dGhpbmcgZWxzZQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGEuc2Vjb25kLT5iZWZvcmUoICpiLnNlY29uZCApICE9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIExldCBhbiBvYmplY3QgcmVnaXN0ZXIgaXRzIGV4aXN0ZW5jZQordm9pZAorb2JqZWN0X3JlZ2lzdHJhcjo6cmVnaXN0ZXJfb2JqZWN0X2ltcAorKAorICAgIG9iamVjdF9pZCAgb2JqCispCit7CisgICAgaWYgKCBkYl8uY291bnQob2JqKSA8PSAwICkKKyAgICB7CisgICAgICAgIGRiXy5pbnNlcnQoIG9iaiApOworCisgICAgICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgICAgIHN0ZDo6Y291dCA8PCAiUmVnaXN0ZXJlZCAiIDw8IG9iaiA8PCAnLicgPDwgc3RkOjplbmRsOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3ZlcmVhZ2VyXy5wdXNoX2JhY2soIG9iaiApOworCisgICAgICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgICAgIHN0ZDo6Y291dCA8PCAiQXR0ZW1wdGVkIHRvIHJlZ2lzdGVyIGEgbm9uLWV4aXN0YW50ICIgPDwgb2JqCisgICAgICAgICA8PCAnLicgPDwgc3RkOjplbmRsOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKKy8vIExldCBhbiBvYmplY3QgcmVnaXN0ZXIgaXRzIHVzZSBvZiBhbm90aGVyIG9iamVjdAordm9pZAorb2JqZWN0X3JlZ2lzdHJhcjo6cmVnaXN0ZXJfdXNlX2ltcAorKAorICAgIG9iamVjdF9pZCAgb3duZXIsCisgICAgb2JqZWN0X2lkICBvd25lZAorKQoreworICAgIGlmICggZGJfLmNvdW50KG93bmVkKSA+IDAgKQorICAgIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSB0byByZWNvcmQgdXNhZ2UgcmVnaXN0cmF0aW9ucworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkZWZyYXVkZXJzX2luXy5wdXNoX2JhY2soIHN0ZDo6bWFrZV9wYWlyKG93bmVyLCBvd25lZCkgKTsKKworICAgICAgICAjaWYgQ09OVFJPTF9FWFRSQV9QUklOVElORworICAgICAgICBzdGQ6OmNvdXQgPDwgIkF0dGVtcHRlZCB0byBvd24gYSBub24tZXhpc3RhbnQgIiA8PCBvd25lZAorICAgICAgICAgPDwgIiBieSAiIDw8IG93bmVyIDw8ICcuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICNlbmRpZgorICAgIH0KK30KKworLy8gTGV0IGFuIG9iamVjdCB1bi1yZWdpc3RlciBpdHMgdXNlIG9mIGFub3RoZXIgb2JqZWN0Cit2b2lkCitvYmplY3RfcmVnaXN0cmFyOjp1bnJlZ2lzdGVyX3VzZV9pbXAKKygKKyAgICBvYmplY3RfaWQgIG93bmVyLAorICAgIG9iamVjdF9pZCAgb3duZWQKKykKK3sKKyAgICBpZiAoIGRiXy5jb3VudChvd25lZCkgPiAwICkKKyAgICB7CisgICAgICAgIC8vIFdlIGRvbid0IGNhcmUgdG8gcmVjb3JkIHVzYWdlIHVuLXJlZ2lzdHJhdGlvbnMKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGVmcmF1ZGVyc19vdXRfLnB1c2hfYmFjayggc3RkOjptYWtlX3BhaXIob3duZXIsIG93bmVkKSApOworCisgICAgICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgICAgIHN0ZDo6Y291dCA8PCAiQXR0ZW1wdGVkIHRvIGRpc293biBhIG5vbi1leGlzdGFudCAiIDw8IG93bmVkCisgICAgICAgICA8PCAiIGJ5ICIgPDwgb3duZXIgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgI2VuZGlmCisgICAgfQorfQorCisvLyBMZXQgYW4gb2JqZWN0IHVuLXJlZ2lzdGVyIGl0cyBleGlzdGVuY2UKK3ZvaWQKK29iamVjdF9yZWdpc3RyYXI6OnVucmVnaXN0ZXJfb2JqZWN0X2ltcAorKAorICAgIG9iamVjdF9pZCAgb2JqCispCit7CisgICAgc2V0X3R5cGU6Oml0ZXJhdG9yIGNvbnN0ICBpID0gZGJfLmZpbmQoIG9iaiApOworCisgICAgaWYgKCBpICE9IGRiXy5lbmQoKSApCisgICAgeworICAgICAgICBkYl8uZXJhc2UoIGkgKTsKKworICAgICAgICAjaWYgQ09OVFJPTF9FWFRSQV9QUklOVElORworICAgICAgICBzdGQ6OmNvdXQgPDwgIlVucmVnaXN0ZXJlZCAiIDw8IG9iaiA8PCAnLicgPDwgc3RkOjplbmRsOworICAgICAgICAjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3ZlcmtpbGxlZF8ucHVzaF9iYWNrKCBvYmogKTsKKworICAgICAgICAjaWYgQ09OVFJPTF9FWFRSQV9QUklOVElORworICAgICAgICBzdGQ6OmNvdXQgPDwgIkF0dGVtcHRlZCB0byB1bnJlZ2lzdGVyIGEgbm9uLWV4aXN0YW50ICIgPDwgb2JqCisgICAgICAgICA8PCAnLicgPDwgc3RkOjplbmRsOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKKy8vIE1hY3JvcyB0byBhYnN0cmFjdCB0aGUgcmVnaXN0cmF0aW9uIG9mIG9iamVjdHMKKyNpZm5kZWYgQk9PU1RfTk9fTUVNQkVSX1RFTVBMQVRFUworI2RlZmluZSBQUklWQVRFX1JFR0lTVEVSX0JJUlRIKG8pICAgICBvYmpfcmVnLnJlZ2lzdGVyX29iamVjdCggKG8pICkKKyNkZWZpbmUgUFJJVkFURV9SRUdJU1RFUl9ERUFUSChvKSAgICAgb2JqX3JlZy51bnJlZ2lzdGVyX29iamVjdCggKG8pICkKKyNkZWZpbmUgUFJJVkFURV9SRUdJU1RFUl9VU0UobywgdykgICAgb2JqX3JlZy5yZWdpc3Rlcl91c2UoIChvKSwgKHcpICkKKyNkZWZpbmUgUFJJVkFURV9VTlJFR0lTVEVSX1VTRShvLCB3KSAgb2JqX3JlZy51bnJlZ2lzdGVyX3VzZSggKG8pLCAodykgKQorI2Vsc2UKKyNkZWZpbmUgUFJJVkFURV9SRUdJU1RFUl9CSVJUSChvKSAgICAgb2JqX3JlZy5yZWdpc3Rlcl9vYmplY3RfaW1wKCBcCisgaWRlbnRpZnkoKG8pKSApCisjZGVmaW5lIFBSSVZBVEVfUkVHSVNURVJfREVBVEgobykgICAgIG9ial9yZWcudW5yZWdpc3Rlcl9vYmplY3RfaW1wKCBcCisgaWRlbnRpZnkoKG8pKSApCisjZGVmaW5lIFBSSVZBVEVfUkVHSVNURVJfVVNFKG8sIHcpICAgIG9ial9yZWcucmVnaXN0ZXJfdXNlX2ltcCggaWRlbnRpZnkoKG8pKSwgXAorIGlkZW50aWZ5KCh3KSkgKQorI2RlZmluZSBQUklWQVRFX1VOUkVHSVNURVJfVVNFKG8sIHcpICBvYmpfcmVnLnVucmVnaXN0ZXJfdXNlX2ltcCggXAorIGlkZW50aWZ5KChvKSksIGlkZW50aWZ5KCh3KSkgKQorI2VuZGlmCisKKy8vIENyZWF0ZSBhIGJhc2Vfb3JfbWVtYmVyLCB3aXRoIGFyZ3VtZW50cyB0byBzaW11bGF0ZSBtZW1iZXIgaW5pdGlhbGl6YXRpb25zCitiYXNlX29yX21lbWJlcjo6YmFzZV9vcl9tZW1iZXIKKygKKyAgICBpbnQgICAgIHgsICAvLyA9IDEKKyAgICBkb3VibGUgIHkgICAvLyA9IC0wLjI1CispCit7CisgICAgUFJJVkFURV9SRUdJU1RFUl9CSVJUSCggKnRoaXMgKTsKKworICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgc3RkOjpjb3V0IDw8ICJcdE15IHgtZmFjdG9yIGlzICIgPDwgeCA8PCAiIGFuZCBteSB5LWZhY3RvciBpcyAiIDw8IHkKKyAgICAgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gRGVzdHJveSBhIGJhc2Vfb3JfbWVtYmVyCitpbmxpbmUKK2Jhc2Vfb3JfbWVtYmVyOjp+YmFzZV9vcl9tZW1iZXIKKygKKykKK3sKKyAgICBQUklWQVRFX1JFR0lTVEVSX0RFQVRIKCAqdGhpcyApOworfQorCisvLyBDcmVhdGUgYSBiYXNlX2NsYXNzLCByZWdpc3RlcmluZyBhbnkgb2JqZWN0cyB1c2VkCitiYXNlX2NsYXNzOjpiYXNlX2NsYXNzCisoCisgICAgYmFzZV9vcl9tZW1iZXIgJiAgeCwKKyAgICBiYXNlX29yX21lbWJlciAqICB5LCAgLy8gPSAwCisgICAgYmFzZV9vcl9tZW1iZXIgKiAgeiAgIC8vID0gMAorKQorICAgIDogeF8oICZ4ICksIHlfKCB5ICksIHpfKCB6ICkKK3sKKyAgICBQUklWQVRFX1JFR0lTVEVSX0JJUlRIKCAqdGhpcyApOworCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgIlx0TXkgeC1mYWN0b3IgaXMgIiA8PCB4XzsKKyAgICAjZW5kaWYKKworICAgIFBSSVZBVEVfUkVHSVNURVJfVVNFKCAqdGhpcywgKnhfICk7CisKKyAgICBpZiAoIHlfICkKKyAgICB7CisgICAgICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgICAgIHN0ZDo6Y291dCA8PCAiLCBteSB5LWZhY3RvciBpcyAiIDw8IHlfOworICAgICAgICAjZW5kaWYKKworICAgICAgICBQUklWQVRFX1JFR0lTVEVSX1VTRSggKnRoaXMsICp5XyApOworICAgIH0KKworICAgIGlmICggel8gKQorICAgIHsKKyAgICAgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIsIG15IHotZmFjdG9yIGlzICIgPDwgel87CisgICAgICAgICNlbmRpZgorCisgICAgICAgIFBSSVZBVEVfUkVHSVNURVJfVVNFKCAqdGhpcywgKnpfICk7CisgICAgfQorCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gRGVzdHJveSBhIGJhc2VfY2xhc3MsIHVucmVnaXN0ZXJpbmcgdGhlIG9iamVjdHMgaXQgdXNlcworYmFzZV9jbGFzczo6fmJhc2VfY2xhc3MKKygKKykKK3sKKyAgICBQUklWQVRFX1JFR0lTVEVSX0RFQVRIKCAqdGhpcyApOworCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgIlx0TXkgeC1mYWN0b3Igd2FzICIgPDwgeF87CisgICAgI2VuZGlmCisKKyAgICBQUklWQVRFX1VOUkVHSVNURVJfVVNFKCAqdGhpcywgKnhfICk7CisKKyAgICBpZiAoIHlfICkKKyAgICB7CisgICAgICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgICAgIHN0ZDo6Y291dCA8PCAiLCBteSB5LWZhY3RvciB3YXMgIiA8PCB5XzsKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgUFJJVkFURV9VTlJFR0lTVEVSX1VTRSggKnRoaXMsICp5XyApOworICAgIH0KKworICAgIGlmICggel8gKQorICAgIHsKKyAgICAgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICAgICAgc3RkOjpjb3V0IDw8ICIsIG15IHotZmFjdG9yIHdhcyAiIDw8IHpfOworICAgICAgICAjZW5kaWYKKworICAgICAgICBQUklWQVRFX1VOUkVHSVNURVJfVVNFKCAqdGhpcywgKnpfICk7CisgICAgfQorCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gQ3JlYXRlIGEgYmFkX2NsYXNzLCBub3RpbmcgdGhlIGltcHJvcGVyIGNvbnN0cnVjdGlvbiBvcmRlcgorYmFkX2NsYXNzOjpiYWRfY2xhc3MKKygKKykKKyAgICA6IHhfKCAtNywgMTYuNzUgKSwgYmFzZV9jbGFzcyggeF8gKSAgLy8gdGhpcyBvcmRlciBkb2Vzbid0IG1hdHRlcgoreworICAgIFBSSVZBVEVfUkVHSVNURVJfQklSVEgoICp0aGlzICk7CisKKyAgICAjaWYgQ09OVFJPTF9FWFRSQV9QUklOVElORworICAgIHN0ZDo6Y291dCA8PCAiXHRNeSBmYWN0b3IgaXMgYXQgIiA8PCAmeF8KKyAgICAgPDwgIiBhbmQgbXkgYmFzZSBpcyBhdCAiIDw8IHN0YXRpY19jYXN0PGJhc2VfY2xhc3MgKj4odGhpcykgPDwgJy4nCisgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gRGVzdHJveSBhIGJhZF9jbGFzcywgbm90aW5nIHRoZSBpbXByb3BlciBkZXN0cnVjdGlvbiBvcmRlcgorYmFkX2NsYXNzOjp+YmFkX2NsYXNzCisoCispCit7CisgICAgUFJJVkFURV9SRUdJU1RFUl9ERUFUSCggKnRoaXMgKTsKKworICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgc3RkOjpjb3V0IDw8ICJcdE15IGZhY3RvciB3YXMgYXQgIiA8PCAmeF8KKyAgICAgPDwgIiBhbmQgbXkgYmFzZSB3YXMgYXQgIiA8PCBzdGF0aWNfY2FzdDxiYXNlX2NsYXNzICo+KHRoaXMpCisgICAgIDw8ICcuJyA8PCBzdGQ6OmVuZGw7CisgICAgI2VuZGlmCit9CisKKy8vIENyZWF0ZSBhIGdvb2RfY2xhc3NfMSwgbm90aW5nIHRoZSBwcm9wZXIgY29uc3RydWN0aW9uIG9yZGVyCitnb29kX2NsYXNzXzE6Omdvb2RfY2xhc3NfMQorKAorKQorICAgIDogcGJhc2VfdHlwZSggOCApLCBiYXNlX3R5cGUoIG1lbWJlciApCit7CisgICAgUFJJVkFURV9SRUdJU1RFUl9CSVJUSCggKnRoaXMgKTsKKworICAgICNpZiBDT05UUk9MX0VYVFJBX1BSSU5USU5HCisgICAgc3RkOjpjb3V0IDw8ICJcdE15IGZhY3RvciBpcyBhdCAiIDw8ICZtZW1iZXIKKyAgICAgPDwgIiBhbmQgbXkgYmFzZSBpcyBhdCAiIDw8IHN0YXRpY19jYXN0PGJhc2VfY2xhc3MgKj4odGhpcykgPDwgJy4nCisgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gRGVzdHJveSBhIGdvb2RfY2xhc3NfMSwgbm90aW5nIHRoZSBwcm9wZXIgZGVzdHJ1Y3Rpb24gb3JkZXIKK2dvb2RfY2xhc3NfMTo6fmdvb2RfY2xhc3NfMQorKAorKQoreworICAgIFBSSVZBVEVfUkVHSVNURVJfREVBVEgoICp0aGlzICk7CisKKyAgICAjaWYgQ09OVFJPTF9FWFRSQV9QUklOVElORworICAgIHN0ZDo6Y291dCA8PCAiXHRNeSBmYWN0b3Igd2FzIGF0ICIgPDwgJm1lbWJlcgorICAgICA8PCAiIGFuZCBteSBiYXNlIHdhcyBhdCAiIDw8IHN0YXRpY19jYXN0PGJhc2VfY2xhc3MgKj4odGhpcykKKyAgICAgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KKworLy8gQ3JlYXRlIGEgZ29vZF9jbGFzc18yLCBub3RpbmcgdGhlIHByb3BlciBjb25zdHJ1Y3Rpb24gb3JkZXIKK2dvb2RfY2xhc3NfMjo6Z29vZF9jbGFzc18yCisoCispCisgICAgOiBwYmFzZV90eXBlMCgpLCBwYmFzZV90eXBlMSgtMTYsIDAuMTI1KSwgcGJhc2VfdHlwZTIoMiwgLTMpCisgICAgLCBiYXNlX3R5cGUoIHBiYXNlX3R5cGUxOjptZW1iZXIsICZ0aGlzLT5wYmFzZV90eXBlMDo6bWVtYmVyLAorICAgICAgICZ0aGlzLT5wYmFzZV90eXBlMjo6bWVtYmVyICkKK3sKKyAgICBQUklWQVRFX1JFR0lTVEVSX0JJUlRIKCAqdGhpcyApOworCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgIlx0TXkgZmFjdG9ycyBhcmUgYXQgIiA8PCAmdGhpcy0+cGJhc2VfdHlwZTA6Om1lbWJlcgorICAgICA8PCAiLCAiIDw8ICZ0aGlzLT5wYmFzZV90eXBlMTo6bWVtYmVyIDw8ICIsICIKKyAgICAgPDwgJnRoaXMtPnBiYXNlX3R5cGUyOjptZW1iZXIgPDwgIiwgYW5kIG15IGJhc2UgaXMgYXQgIgorICAgICA8PCBzdGF0aWNfY2FzdDxiYXNlX2NsYXNzICo+KHRoaXMpIDw8ICcuJyA8PCBzdGQ6OmVuZGw7CisgICAgI2VuZGlmCit9CisKKy8vIERlc3Ryb3kgYSBnb29kX2NsYXNzXzIsIG5vdGluZyB0aGUgcHJvcGVyIGRlc3RydWN0aW9uIG9yZGVyCitnb29kX2NsYXNzXzI6On5nb29kX2NsYXNzXzIKKygKKykKK3sKKyAgICBQUklWQVRFX1JFR0lTVEVSX0RFQVRIKCAqdGhpcyApOworCisgICAgI2lmIENPTlRST0xfRVhUUkFfUFJJTlRJTkcKKyAgICBzdGQ6OmNvdXQgPDwgIlx0TXkgZmFjdG9ycyB3ZXJlIGF0ICIgPDwgJnRoaXMtPnBiYXNlX3R5cGUwOjptZW1iZXIKKyAgICAgPDwgIiwgIiA8PCAmdGhpcy0+cGJhc2VfdHlwZTE6Om1lbWJlciA8PCAiLCAiCisgICAgIDw8ICZ0aGlzLT5wYmFzZV90eXBlMjo6bWVtYmVyIDw8ICIsIGFuZCBteSBiYXNlIHdhcyBhdCAiCisgICAgIDw8IHN0YXRpY19jYXN0PGJhc2VfY2xhc3MgKj4odGhpcykgPDwgJy4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3Rlc3QvYmluYXJ5X3Rlc3QuY3BwIGIvdGVzdC9iaW5hcnlfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5ZGMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvYmluYXJ5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNjQ3IEBACisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE1hdHRoZXcgQ2FsYWJyZXNlCisKKyAgICBVc2UsIG1vZGlmaWNhdGlvbiBhbmQgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlCisgICAgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKyAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L2JpbmFyeS5ocHA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpZmRlZiBCT09TVF9NU1ZDCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KSAvLyB3YXJuaW5nIEM0OTk2OiAnc3RkOjplcXVhbCc6IEZ1bmN0aW9uIGNhbGwgd2l0aCBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIHVuc2FmZSAtIHRoaXMgY2FsbCByZWxpZXMgb24gdGhlIGNhbGxlciB0byBjaGVjayB0aGF0IHRoZSBwYXNzZWQgdmFsdWVzIGFyZSBjb3JyZWN0LiBUbyBkaXNhYmxlIHRoaXMgd2FybmluZywgdXNlIC1EX1NDTF9TRUNVUkVfTk9fV0FSTklOR1MuIFNlZSBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byB1c2UgVmlzdWFsIEMrKyAnQ2hlY2tlZCBJdGVyYXRvcnMnCisjZW5kaWYKKworLyoKK05vdGU6IFRoaXMgZmlsZSB0ZXN0cyBldmVyeSBzaW5nbGUgdmFsaWQgYml0LWdyb3VwaW5nIG9uIGl0cyBvd24sIGFuZCBzb21lCisgICAgICByYW5kb20gY29tYmluYXRpb25zIG9mIGJpdC1ncm91cGluZ3MuCisqLworCitzdGQ6OnNpemVfdCBjb25zdCBudW1fcmFuZG9tX3Rlc3RfdmFsdWVzID0gMzI7CisKKy8vIE5vdGU6IFRoZXNlIGhleCB2YWx1ZXMgc2hvdWxkIGFsbCBjb3JyZXNwb25kIHdpdGggdGhlIGJpbmFyeSBhcnJheSBiZWxvdwordW5zaWduZWQgaW50IGNvbnN0IHJhbmRvbV91bnNpZ25lZF9pbnRzX2hleFtudW1fcmFuZG9tX3Rlc3RfdmFsdWVzXQorICA9IHsgMHgwMTAzdSwgMHg3N2VidSwgMHg1ZjM2dSwgMHgxZjE4dSwgMHhjNTMwdSwgMHhhNzNhdSwgMHhkNmY4dSwgMHgwOTE5dQorICAgICwgMHhmYmIwdSwgMHgzZTdjdSwgMHhkMGU5dSwgMHgyMmM4dSwgMHg3MjRldSwgMHgxNGZhdSwgMHhkOThldSwgMHg0MGI1CisgICAgLCAweGViYTB1LCAweGZlNTB1LCAweDY4OGF1LCAweDFiMDV1LCAweDVmOWN1LCAweGU0ZmN1LCAweGE3Yjh1LCAweGQzYWN1CisgICAgLCAweDFkZGR1LCAweGJmMDR1LCAweDgzNTJ1LCAweGU4OWN1LCAweDc1MDZ1LCAweGU3Njd1LCAweGY0ODl1LCAweGUxNjcKKyAgICB9OworCit1bnNpZ25lZCBpbnQgY29uc3QgcmFuZG9tX3Vuc2lnbmVkX2ludHNfYmluYXJ5W251bV9yYW5kb21fdGVzdF92YWx1ZXNdCisgID0geyBCT09TVF9CSU5BUlkoIDAgMDAwMTAwMDAgMDAxMSApLCBCT09TVF9CSU5BUlkoIDAgMTExMDEgMTExMSAgMTAxMDExICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMDEwMTExIDExMDAxMTAgMSAxIDAgKSwgQk9PU1RfQklOQVJZKCAwMDAgMSAxMTExMCAwMCAxMTAwMCApCisgICAgLCBCT09TVF9CSU5BUlkoIDExMCAwMDEwMTAgMDExMCAwMDAgKSwgQk9PU1RfQklOQVJZKCAxMDEwIDAxMTEwMDExIDEwMTAgKQorICAgICwgQk9PU1RfQklOQVJZKCAxMSAwMTAgMSAxMDExMTEgMTAwMCApLCBCT09TVF9CSU5BUlkoIDAwMDAgMTAwMTAwIDAxMTAgMDEgKQorICAgICwgQk9PU1RfQklOQVJZKCAxMTExIDEwMTExMCAxMSAwMDAwICksIEJPT1NUX0JJTkFSWSggMDAxMTExMTAgMDExMTExMDAgKQorICAgICwgQk9PU1RfQklOQVJZKCAxMSAgMDEwIDAwMDExMSAwMTAwMSApLCBCT09TVF9CSU5BUlkoIDAwMTAwIDAxMDExMCAgIDAxMDAwICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMDEgMTEwMDEwMDEgMDAxMTEwICksIEJPT1NUX0JJTkFSWSggMDAxMCAxMDAxMTExIDEwMTAgKQorICAgICwgQk9PU1RfQklOQVJZKCAxMTAxIDEgMDAxMTAgMCAwMTExMCApLCBCT09TVF9CSU5BUlkoIDEwMCAwMDAgMDEwMTEwMTAgMSApCisgICAgLCBCT09TVF9CSU5BUlkoIDExIDEwMTAgMTExMCAxMDAwIDAwICksIEJPT1NUX0JJTkFSWSggMTExMTEgMTEwMDEwIDEwMDAwICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMDExMDEgMDAwMTAgMDAxMDEwICksIEJPT1NUX0JJTkFSWSggMDAwIDExMDExIDAwMDAwMSAwMSApCisgICAgLCBCT09TVF9CSU5BUlkoIDAxIDAxMTExIDExMDAxMTEgMDAgKSwgQk9PU1RfQklOQVJZKCAxIDExMDAxMCAwMTExMTExIDAwICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMTAxIDAwMTEgMTEgMDExMTAgMDAgKSwgQk9PU1RfQklOQVJZKCAxMTAxMDAgMSAxMTAxMDEgMTAwICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMDAgMTExMDExMSAwMTEgMTAxICksIEJPT1NUX0JJTkFSWSggMTAxMSAxMTExIDAwMDAwIDEwMCApCisgICAgLCBCT09TVF9CSU5BUlkoIDEwMDAgMDAxMTAgMTAxIDAwMTAgKSwgQk9PU1RfQklOQVJZKCAxMTEwICAxMDAwMSAwMDExMTAgMCApCisgICAgLCBCT09TVF9CSU5BUlkoIDAxMSAxMDEwMTAwIDAwMCAxMTAgKSwgQk9PU1RfQklOQVJZKCAxMTEwIDAxMTEgMDExMDAgMTExICkKKyAgICAsIEJPT1NUX0JJTkFSWSggMTExMTAgMTAwMTAgMDAxMDAxICksIEJPT1NUX0JJTkFSWSggMTEgMTAwMDAxMCAxMTAwIDExMSApCisgICAgfTsKKwordW5zaWduZWQgaW50IGNvbnN0IHVuc2lnbmVkX2ludHNfMV9iaXRbMl0gPQoreyBCT09TVF9CSU5BUlkoIDAgKQorLCBCT09TVF9CSU5BUlkoIDEgKQorfTsKKwordW5zaWduZWQgaW50IGNvbnN0IHVuc2lnbmVkX2ludHNfMl9iaXRzWzRdID0KK3sgQk9PU1RfQklOQVJZKCAwMCApCissIEJPT1NUX0JJTkFSWSggMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwICkKKywgQk9PU1RfQklOQVJZKCAxMSApCit9OworCit1bnNpZ25lZCBpbnQgY29uc3QgdW5zaWduZWRfaW50c18zX2JpdHNbOF0gPQoreyBCT09TVF9CSU5BUlkoIDAwMCApCissIEJPT1NUX0JJTkFSWSggMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMSApCissIEJPT1NUX0JJTkFSWSggMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMCApCissIEJPT1NUX0JJTkFSWSggMTExICkKK307CisKK3Vuc2lnbmVkIGludCBjb25zdCB1bnNpZ25lZF9pbnRzXzRfYml0c1sxNl0gPQoreyBCT09TVF9CSU5BUlkoIDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTEgKQorfTsKKwordW5zaWduZWQgaW50IGNvbnN0IHVuc2lnbmVkX2ludHNfNV9iaXRzWzMyXSA9Cit7IEJPT1NUX0JJTkFSWSggMDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTExICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMTExMCApCissIEJPT1NUX0JJTkFSWSggMDExMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDExICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMDExMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTExMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTExICkKK307CisKK3Vuc2lnbmVkIGludCBjb25zdCB1bnNpZ25lZF9pbnRzXzZfYml0c1s2NF0gPQoreyBCT09TVF9CSU5BUlkoIDAwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDExMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTExICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMDExMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTExMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDExICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDExMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDExMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMTExMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTExMCApCissIEJPT1NUX0JJTkFSWSggMDExMTExICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDExMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDExICkKKywgQk9PU1RfQklOQVJZKCAxMDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMDExMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMDExMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTExICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTExMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTExMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMTExMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTExMSApCit9OworCit1bnNpZ25lZCBpbnQgY29uc3QgdW5zaWduZWRfaW50c183X2JpdHNbMTI4XSA9Cit7IEJPT1NUX0JJTkFSWSggMDAwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDExMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDExMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTExMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTExMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDExMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDExMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTExMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTExMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDExMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDExMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTExMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTExMSApCissIEJPT1NUX0JJTkFSWSggMDExMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDExMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDExMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDExMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDExMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDExMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDExMDExMCApCissIEJPT1NUX0JJTkFSWSggMDExMDExMSApCissIEJPT1NUX0JJTkFSWSggMDExMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDExMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDExMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDExMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDExMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDExMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDExMTExMCApCissIEJPT1NUX0JJTkFSWSggMDExMTExMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDExMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDExMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTExMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTExMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDExMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDExMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTExMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTExMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDExMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDExMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTExMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTExMSApCissIEJPT1NUX0JJTkFSWSggMTExMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTExMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTExMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTExMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTExMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTExMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTExMDExMCApCissIEJPT1NUX0JJTkFSWSggMTExMDExMSApCissIEJPT1NUX0JJTkFSWSggMTExMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTExMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTExMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTExMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTExMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTExMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTExMTExMCApCissIEJPT1NUX0JJTkFSWSggMTExMTExMSApCit9OwordW5zaWduZWQgaW50IGNvbnN0IHVuc2lnbmVkX2ludHNfOF9iaXRzWzI1Nl0gPQoreyBCT09TVF9CSU5BUlkoIDAwMDAwMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAwMDExICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAwMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMDExMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAxMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDAwMDEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAxMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMDAwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMDExMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDAxMTExICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDEwMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDEwMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMDExMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDExMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDAwMTEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMDExMDExICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDAwMTExMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMDExMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMDAxMTExMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAwMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAwMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAwMTExICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAxMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDAxMDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTAxMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMDEwMTExMCApCissIEJPT1NUX0JJTkFSWSggMDAxMDExMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTEwMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMDExMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTEwMDExICkKKywgQk9PU1RfQklOQVJZKCAwMDExMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTEwMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMDExMDExMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTExMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMDExMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDAxMTEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAwMTExMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMDExMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDAxMTExMTAgKQorLCBCT09TVF9CSU5BUlkoIDAwMTExMTExICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAwMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAwMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMDExMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAxMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMDEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAxMDExICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMDExMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDAxMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMTAwMTExMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEwMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMDAxMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEwMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMDEwMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDEwMTExICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMTAwMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMDExMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMTAxMSApCissIEJPT1NUX0JJTkFSWSggMDEwMTExMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMDExMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMTAxMTExMCApCissIEJPT1NUX0JJTkFSWSggMDEwMTExMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAwMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMDExMDAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAwMDExICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMDExMDAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAwMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMDExMSApCissIEJPT1NUX0JJTkFSWSggMDExMDEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAxMDAxICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMDExMDEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAxMTAwICkKKywgQk9PU1RfQklOQVJZKCAwMTEwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMDExMDExMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTAxMTExICkKKywgQk9PU1RfQklOQVJZKCAwMTExMDAwMCApCissIEJPT1NUX0JJTkFSWSggMDExMTAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTEwMDEwICkKKywgQk9PU1RfQklOQVJZKCAwMTExMDAxMSApCissIEJPT1NUX0JJTkFSWSggMDExMTAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTEwMTAxICkKKywgQk9PU1RfQklOQVJZKCAwMTExMDExMCApCissIEJPT1NUX0JJTkFSWSggMDExMTAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTExMDAwICkKKywgQk9PU1RfQklOQVJZKCAwMTExMTAwMSApCissIEJPT1NUX0JJTkFSWSggMDExMTEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDAxMTExMDExICkKKywgQk9PU1RfQklOQVJZKCAwMTExMTEwMCApCissIEJPT1NUX0JJTkFSWSggMDExMTExMDEgKQorLCBCT09TVF9CSU5BUlkoIDAxMTExMTEwICkKKywgQk9PU1RfQklOQVJZKCAwMTExMTExMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAwMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAwMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAwMTExICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAxMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTAwMDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDAxMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMDAwMTExMCApCissIEJPT1NUX0JJTkFSWSggMTAwMDExMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDEwMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDEwMDExICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDEwMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMDExMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDExMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTAwMTEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMDExMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMDAxMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTAwMTExMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMDExMTExICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAwMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAwMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMDExMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAxMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMDEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAxMDExICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMDExMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTAxMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMDEwMTExMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEwMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMDExMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEwMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMDExMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTEwMTExICkKKywgQk9PU1RfQklOQVJZKCAxMDExMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDEwMTExMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMDExMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTAxMTExMDAgKQorLCBCT09TVF9CSU5BUlkoIDEwMTExMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMDExMTExMCApCissIEJPT1NUX0JJTkFSWSggMTAxMTExMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMDAwMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMDAwMDExICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMDAwMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMDExMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMDAxMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTEwMDEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMDAxMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMTAwMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMDExMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMDAxMTExICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMDAwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTAwMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMDEwMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMDAxMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTAxMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMDEwMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMDExMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTAxMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMDExMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMTAwMSApCissIEJPT1NUX0JJTkFSWSggMTEwMTEwMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMDExMDExICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMTEwMCApCissIEJPT1NUX0JJTkFSWSggMTEwMTExMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMDExMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMTAxMTExMSApCissIEJPT1NUX0JJTkFSWSggMTExMDAwMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMTAwMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMDAxMCApCissIEJPT1NUX0JJTkFSWSggMTExMDAwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMTAwMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMDEwMSApCissIEJPT1NUX0JJTkFSWSggMTExMDAxMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTAwMTExICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMTAwMCApCissIEJPT1NUX0JJTkFSWSggMTExMDEwMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMTAxMDEwICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMTAxMSApCissIEJPT1NUX0JJTkFSWSggMTExMDExMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMTAxMTAxICkKKywgQk9PU1RfQklOQVJZKCAxMTEwMTExMCApCissIEJPT1NUX0JJTkFSWSggMTExMDExMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMTEwMDAwICkKKywgQk9PU1RfQklOQVJZKCAxMTExMDAwMSApCissIEJPT1NUX0JJTkFSWSggMTExMTAwMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTEwMDExICkKKywgQk9PU1RfQklOQVJZKCAxMTExMDEwMCApCissIEJPT1NUX0JJTkFSWSggMTExMTAxMDEgKQorLCBCT09TVF9CSU5BUlkoIDExMTEwMTEwICkKKywgQk9PU1RfQklOQVJZKCAxMTExMDExMSApCissIEJPT1NUX0JJTkFSWSggMTExMTEwMDAgKQorLCBCT09TVF9CSU5BUlkoIDExMTExMDAxICkKKywgQk9PU1RfQklOQVJZKCAxMTExMTAxMCApCissIEJPT1NUX0JJTkFSWSggMTExMTEwMTEgKQorLCBCT09TVF9CSU5BUlkoIDExMTExMTAwICkKKywgQk9PU1RfQklOQVJZKCAxMTExMTEwMSApCissIEJPT1NUX0JJTkFSWSggMTExMTExMTAgKQorLCBCT09TVF9CSU5BUlkoIDExMTExMTExICkKK307CisKK3N0cnVjdCBsZWZ0X2lzX25vdF9vbmVfbGVzc190aGFuX3JpZ2h0Cit7CisgIGJvb2wgb3BlcmF0b3IgKCkoIHVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgcmlnaHQgKSBjb25zdAorICB7CisgICAgcmV0dXJuIHJpZ2h0ICE9IGxlZnQgKyAxOworICB9Cit9OworCit0ZW1wbGF0ZTwgc3RkOjpzaXplX3QgU2l6ZSA+Citib29sIGlzX2FzY2VuZGluZ19mcm9tXzBfYXJyYXkoIHVuc2lnbmVkIGludCBjb25zdCAoJmFycmF5KVtTaXplXSApCit7CisgIHVuc2lnbmVkIGludCBjb25zdCogY29uc3QgY3VyciA9IGFycmF5LAorICAgICAgICAgICAgICAgICAgICAqIGNvbnN0IGVuZCAgPSBhcnJheSArIFNpemU7CisKKyAgcmV0dXJuICAgICggKmN1cnIgPT0gMCApCisgICAgICAgICAmJiAoICAgIHN0ZDo6YWRqYWNlbnRfZmluZCggY3VyciwgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbGVmdF9pc19ub3Rfb25lX2xlc3NfdGhhbl9yaWdodCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgPT0gZW5kCisgICAgICAgICAgICApOworfQorCitzdGQ6OnNpemVfdCBjb25zdCB1bnNpZ25lZF9pbnRfaWQgPSAxLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWRfbG9uZ19pbnRfaWQgPSAyOworCit0eXBlZGVmIGNoYXIgKCZ1bnNpZ25lZF9pbnRfaWRfdHlwZSlbdW5zaWduZWRfaW50X2lkXTsKK3R5cGVkZWYgY2hhciAoJnVuc2lnbmVkX2xvbmdfaW50X2lkX3R5cGUpW3Vuc2lnbmVkX2xvbmdfaW50X2lkXTsKKworLy8gTm90ZTogRnVuY3Rpb25zIG9ubHkgdXNlZCBmb3IgdHlwZSBjaGVja2luZwordW5zaWduZWRfaW50X2lkX3R5cGUgICAgICBiaW5hcnlfdHlwZV9jaGVja2VyKCB1bnNpZ25lZCBpbnQgKTsKK3Vuc2lnbmVkX2xvbmdfaW50X2lkX3R5cGUgYmluYXJ5X3R5cGVfY2hlY2tlciggdW5zaWduZWQgbG9uZyBpbnQgKTsKKworaW50IG1haW4oKQoreworICBCT09TVF9URVNUKCBpc19hc2NlbmRpbmdfZnJvbV8wX2FycmF5KCB1bnNpZ25lZF9pbnRzXzFfYml0ICkgKTsKKyAgQk9PU1RfVEVTVCggaXNfYXNjZW5kaW5nX2Zyb21fMF9hcnJheSggdW5zaWduZWRfaW50c18yX2JpdHMgKSApOworICBCT09TVF9URVNUKCBpc19hc2NlbmRpbmdfZnJvbV8wX2FycmF5KCB1bnNpZ25lZF9pbnRzXzNfYml0cyApICk7CisgIEJPT1NUX1RFU1QoIGlzX2FzY2VuZGluZ19mcm9tXzBfYXJyYXkoIHVuc2lnbmVkX2ludHNfNF9iaXRzICkgKTsKKyAgQk9PU1RfVEVTVCggaXNfYXNjZW5kaW5nX2Zyb21fMF9hcnJheSggdW5zaWduZWRfaW50c181X2JpdHMgKSApOworICBCT09TVF9URVNUKCBpc19hc2NlbmRpbmdfZnJvbV8wX2FycmF5KCB1bnNpZ25lZF9pbnRzXzZfYml0cyApICk7CisgIEJPT1NUX1RFU1QoIGlzX2FzY2VuZGluZ19mcm9tXzBfYXJyYXkoIHVuc2lnbmVkX2ludHNfN19iaXRzICkgKTsKKyAgQk9PU1RfVEVTVCggaXNfYXNjZW5kaW5nX2Zyb21fMF9hcnJheSggdW5zaWduZWRfaW50c184X2JpdHMgKSApOworCisgIEJPT1NUX1RFU1QoIHN0ZDo6ZXF1YWwoICZyYW5kb21fdW5zaWduZWRfaW50c19oZXhbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAsIHJhbmRvbV91bnNpZ25lZF9pbnRzX2hleCArIG51bV9yYW5kb21fdGVzdF92YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAsICZyYW5kb21fdW5zaWduZWRfaW50c19iaW5hcnlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgKTsKKworICBCT09TVF9URVNUKCAgICBzaXplb2YoIGJpbmFyeV90eXBlX2NoZWNrZXIoIEJPT1NUX0JJTkFSWV9VKCAxMTAxMDAgMTAxMCApICkgKQorICAgICAgICAgICAgICAgPT0gdW5zaWduZWRfaW50X2lkCisgICAgICAgICAgICAgKTsKKworICBCT09TVF9URVNUKCAgICBzaXplb2YoIGJpbmFyeV90eXBlX2NoZWNrZXIoIEJPT1NUX0JJTkFSWV9VTCggMTExMTAgKSApICkKKyAgICAgICAgICAgICAgID09IHVuc2lnbmVkX2xvbmdfaW50X2lkCisgICAgICAgICAgICAgKTsKKworICBCT09TVF9URVNUKCAgICBzaXplb2YoIGJpbmFyeV90eXBlX2NoZWNrZXIoIEJPT1NUX0JJTkFSWV9MVSggMTAgMDAwMSApICkgKQorICAgICAgICAgICAgICAgPT0gdW5zaWduZWRfbG9uZ19pbnRfaWQKKyAgICAgICAgICAgICApOworCisgIHJldHVybiBib29zdDo6cmVwb3J0X2Vycm9ycygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jYWxsX3RyYWl0c190ZXN0LmNwcCBiL3Rlc3QvY2FsbF90cmFpdHNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0OWI2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2FsbF90cmFpdHNfdGVzdC5jcHAKQEAgLTAsMCArMSw0MTggQEAKKy8vICBib29zdDo6Y29tcHJlc3NlZF9wYWlyIHRlc3QgcHJvZ3JhbSAgIAorICAgIAorLy8gIChDKSBDb3B5cmlnaHQgSm9obiBNYWRkb2NrIDIwMDAuIAorLy8gIFVzZSwgbW9kaWZpY2F0aW9uIGFuZCBkaXN0cmlidXRpb24gYXJlIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsCisvLyAgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpLgorCisKKy8vIHN0YW5kYWxvbmUgdGVzdCBwcm9ncmFtIGZvciA8Ym9vc3QvY2FsbF90cmFpdHMuaHBwPgorLy8gMTggTWFyIDIwMDI6CisvLyAgICBDaGFuZ2VkIHNvbWUgbmFtZXMgdG8gcHJldmVudCBjb25mbGljdHMgd2l0aCBzb21lIG5ldyB0eXBlX3RyYWl0cyBhZGRpdGlvbnMuCisvLyAwMyBPY3QgMjAwMDoKKy8vICAgIEVuYWJsZWQgZXh0cmEgdGVzdHMgZm9yIFZDNi4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPGJvb3N0L2NhbGxfdHJhaXRzLmhwcD4KKworI2luY2x1ZGUgPGxpYnMvdHlwZV90cmFpdHMvdGVzdC90ZXN0LmhwcD4KKyNpbmNsdWRlIDxsaWJzL3R5cGVfdHJhaXRzL3Rlc3QvY2hlY2tfdHlwZS5ocHA+CisKKyNpZmRlZiBCT09TVF9NU1ZDCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTgxKSAvLyA6IHdhcm5pbmcgQzQxODE6IHF1YWxpZmllciBhcHBsaWVkIHRvIHJlZmVyZW5jZSB0eXBlOyBpZ25vcmVkCisjZW5kaWYKKworLy8gYSB3YXkgcHJldmVudCB3YXJuaW5ncyBmb3IgdW51c2VkIHZhcmlhYmxlcwordGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgdW51c2VkX3ZhcmlhYmxlKGNvbnN0IFQmKSB7fQorCisvLworLy8gc3RydWN0IGNvbnRhaW5lZCBtb2RlbHMgYSB0eXBlIHRoYXQgY29udGFpbnMgYSB0eXBlIChmb3IgZXhhbXBsZSBzdGQ6OnBhaXIpCisvLyBhcnJheXMgYXJlIGNvbnRhaW5lZCBieSB2YWx1ZSwgYW5kIGhhdmUgdG8gYmUgdHJlYXRlZCBhcyBhIHNwZWNpYWwgY2FzZToKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBjb250YWluZWQKK3sKKyAgIC8vIGRlZmluZSBvdXIgdHlwZWRlZnMgZmlyc3QsIGFycmF5cyBhcmUgc3RvcmVkIGJ5IHZhbHVlCisgICAvLyBzbyB2YWx1ZV90eXBlIGlzIG5vdCB0aGUgc2FtZSBhcyByZXN1bHRfdHlwZToKKyAgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzPFQ+OjpwYXJhbV90eXBlICAgICAgIHBhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUPjo6cmVmZXJlbmNlICAgICAgICByZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUPjo6Y29uc3RfcmVmZXJlbmNlICBjb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHM8VD46OnZhbHVlX3R5cGUgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgIC8vIHN0b3JlZCB2YWx1ZToKKyAgIHZhbHVlX3R5cGUgdl87CisgICAKKyAgIC8vIGNvbnN0cnVjdG9yczoKKyAgIGNvbnRhaW5lZCgpIHt9CisgICBjb250YWluZWQocGFyYW1fdHlwZSBwKSA6IHZfKHApe30KKyAgIC8vIHJldHVybiBieXZhbDoKKyAgIHJlc3VsdF90eXBlIHZhbHVlKCljb25zdCB7IHJldHVybiB2XzsgfQorICAgLy8gcmV0dXJuIGJ5X3JlZjoKKyAgIHJlZmVyZW5jZSBnZXQoKSB7IHJldHVybiB2XzsgfQorICAgY29uc3RfcmVmZXJlbmNlIGNvbnN0X2dldCgpY29uc3QgeyByZXR1cm4gdl87IH0KKyAgIC8vIHBhc3MgdmFsdWU6CisgICB2b2lkIGNhbGwocGFyYW1fdHlwZSl7fQorcHJpdmF0ZToKKyAgIGNvbnRhaW5lZCYgb3BlcmF0b3I9KGNvbnN0IGNvbnRhaW5lZCYpOworfTsKKworI2lmbmRlZiBCT09TVF9OT19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4KK3N0cnVjdCBjb250YWluZWQ8VFtOXT4KK3sKKyAgIHR5cGVkZWYgdHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzPFRbTl0+OjpwYXJhbV90eXBlICAgICAgIHBhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUW05dPjo6cmVmZXJlbmNlICAgICAgICByZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUW05dPjo6Y29uc3RfcmVmZXJlbmNlICBjb25zdF9yZWZlcmVuY2U7CisgICB0eXBlZGVmIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlW05dOworICAgdHlwZWRlZiB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHM8VFtOXT46OnZhbHVlX3R5cGUgICAgICAgcmVzdWx0X3R5cGU7CisKKyAgIHZhbHVlX3R5cGUgdl87CisKKyAgIGNvbnRhaW5lZChwYXJhbV90eXBlIHApCisgICB7CisgICAgICBzdGQ6OmNvcHkocCwgcCtOLCB2Xyk7CisgICB9CisgICAvLyByZXR1cm4gYnl2YWw6CisgICByZXN1bHRfdHlwZSB2YWx1ZSgpY29uc3QgeyByZXR1cm4gdl87IH0KKyAgIC8vIHJldHVybiBieV9yZWY6CisgICByZWZlcmVuY2UgZ2V0KCkgeyByZXR1cm4gdl87IH0KKyAgIGNvbnN0X3JlZmVyZW5jZSBjb25zdF9nZXQoKWNvbnN0IHsgcmV0dXJuIHZfOyB9CisgICB2b2lkIGNhbGwocGFyYW1fdHlwZSl7fQorcHJpdmF0ZToKKyAgIGNvbnRhaW5lZCYgb3BlcmF0b3I9KGNvbnN0IGNvbnRhaW5lZCYpOworfTsKKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnRhaW5lZDx0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHM8VD46OnZhbHVlX3R5cGU+IHRlc3Rfd3JhcF90eXBlKGNvbnN0IFQmIHQpCit7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUPjo6dmFsdWVfdHlwZSBjdDsKKyAgIHJldHVybiBjb250YWluZWQ8Y3Q+KHQpOworfQorCituYW1lc3BhY2UgdGVzdHsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3N0ZDo6cGFpcjwKKyAgIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUMT46OnZhbHVlX3R5cGUsCisgICB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHM8VDI+Ojp2YWx1ZV90eXBlPgorICAgICAgbWFrZV9wYWlyKGNvbnN0IFQxJiB0MSwgY29uc3QgVDImIHQyKQoreworICAgcmV0dXJuIHN0ZDo6cGFpcjwKKyAgICAgIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUMT46OnZhbHVlX3R5cGUsCisgICAgICB0eXBlbmFtZSBib29zdDo6Y2FsbF90cmFpdHM8VDI+Ojp2YWx1ZV90eXBlPih0MSwgdDIpOworfQorCit9IC8vIG5hbWVzcGFjZSB0ZXN0CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8vCisvLyBzdHJ1Y3QgY2FsbF90cmFpdHNfY2hlY2tlcjoKKy8vIHZlcmlmaWVzIGJlaGF2aW91ciBvZiBjb250YWluZWQgZXhhbXBsZToKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBjYWxsX3RyYWl0c19jaGVja2VyCit7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUPjo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgdm9pZCBvcGVyYXRvcigpKHBhcmFtX3R5cGUpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIGNhbGxfdHJhaXRzX2NoZWNrZXI8VD46Om9wZXJhdG9yKCkocGFyYW1fdHlwZSBwKQoreworICAgVCB0KHApOworICAgY29udGFpbmVkPFQ+IGModCk7CisgICBjb3V0IDw8ICJjaGVja2luZyBjb250YWluZWQ8IiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICI+Li4uIiA8PCBlbmRsOworICAgQk9PU1RfQ0hFQ0sodCA9PSBjLnZhbHVlKCkpOworICAgQk9PU1RfQ0hFQ0sodCA9PSBjLmdldCgpKTsKKyAgIEJPT1NUX0NIRUNLKHQgPT0gYy5jb25zdF9nZXQoKSk7CisjaWZuZGVmIF9fSUNMCisgICAvL2NvdXQgPDwgInR5cGVvZiBjb250YWluZWQ8IiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICI+Ojp2XyBpczogICAgICAgICAgICIgPDwgdHlwZWlkKCZjb250YWluZWQ8VD46OnZfKS5uYW1lKCkgPDwgZW5kbDsKKyAgIGNvdXQgPDwgInR5cGVvZiBjb250YWluZWQ8IiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICI+Ojp2YWx1ZSgpIGlzOiAgICAgICIgPDwgdHlwZWlkKCZjb250YWluZWQ8VD46OnZhbHVlKS5uYW1lKCkgPDwgZW5kbDsKKyAgIGNvdXQgPDwgInR5cGVvZiBjb250YWluZWQ8IiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICI+OjpnZXQoKSBpczogICAgICAgICIgPDwgdHlwZWlkKCZjb250YWluZWQ8VD46OmdldCkubmFtZSgpIDw8IGVuZGw7CisgICBjb3V0IDw8ICJ0eXBlb2YgY29udGFpbmVkPCIgPDwgdHlwZWlkKFQpLm5hbWUoKSA8PCAiPjo6Y29uc3RfZ2V0KCkgaXM6ICAiIDw8IHR5cGVpZCgmY29udGFpbmVkPFQ+Ojpjb25zdF9nZXQpLm5hbWUoKSA8PCBlbmRsOworICAgY291dCA8PCAidHlwZW9mIGNvbnRhaW5lZDwiIDw8IHR5cGVpZChUKS5uYW1lKCkgPDwgIj46OmNhbGwoKSBpczogICAgICAgIiA8PCB0eXBlaWQoJmNvbnRhaW5lZDxUPjo6Y2FsbCkubmFtZSgpIDw8IGVuZGw7CisgICBjb3V0IDw8IGVuZGw7CisjZW5kaWYKK30KKworI2lmbmRlZiBCT09TVF9OT19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4KK3N0cnVjdCBjYWxsX3RyYWl0c19jaGVja2VyPFRbTl0+Cit7CisgICB0eXBlZGVmIHR5cGVuYW1lIGJvb3N0OjpjYWxsX3RyYWl0czxUW05dPjo6cGFyYW1fdHlwZSBwYXJhbV90eXBlOworICAgdm9pZCBvcGVyYXRvcigpKHBhcmFtX3R5cGUgdCkKKyAgIHsKKyAgICAgIGNvbnRhaW5lZDxUW05dPiBjKHQpOworICAgICAgY291dCA8PCAiY2hlY2tpbmcgY29udGFpbmVkPCIgPDwgdHlwZWlkKFRbTl0pLm5hbWUoKSA8PCAiPi4uLiIgPDwgZW5kbDsKKyAgICAgIHVuc2lnbmVkIGludCBpID0gMDsKKyAgICAgIGZvcihpID0gMDsgaSA8IE47ICsraSkKKyAgICAgICAgIEJPT1NUX0NIRUNLKHRbaV0gPT0gYy52YWx1ZSgpW2ldKTsKKyAgICAgIGZvcihpID0gMDsgaSA8IE47ICsraSkKKyAgICAgICAgIEJPT1NUX0NIRUNLKHRbaV0gPT0gYy5nZXQoKVtpXSk7CisgICAgICBmb3IoaSA9IDA7IGkgPCBOOyArK2kpCisgICAgICAgICBCT09TVF9DSEVDSyh0W2ldID09IGMuY29uc3RfZ2V0KClbaV0pOworCisgICAgICBjb3V0IDw8ICJ0eXBlb2YgY29udGFpbmVkPCIgPDwgdHlwZWlkKFRbTl0pLm5hbWUoKSA8PCAiPjo6dl8gaXM6ICAgICAgICAgIiA8PCB0eXBlaWQoJmNvbnRhaW5lZDxUW05dPjo6dl8pLm5hbWUoKSA8PCBlbmRsOworICAgICAgY291dCA8PCAidHlwZW9mIGNvbnRhaW5lZDwiIDw8IHR5cGVpZChUW05dKS5uYW1lKCkgPDwgIj46OnZhbHVlIGlzOiAgICAgICIgPDwgdHlwZWlkKCZjb250YWluZWQ8VFtOXT46OnZhbHVlKS5uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGNvdXQgPDwgInR5cGVvZiBjb250YWluZWQ8IiA8PCB0eXBlaWQoVFtOXSkubmFtZSgpIDw8ICI+OjpnZXQgaXM6ICAgICAgICAiIDw8IHR5cGVpZCgmY29udGFpbmVkPFRbTl0+OjpnZXQpLm5hbWUoKSA8PCBlbmRsOworICAgICAgY291dCA8PCAidHlwZW9mIGNvbnRhaW5lZDwiIDw8IHR5cGVpZChUW05dKS5uYW1lKCkgPDwgIj46OmNvbnN0X2dldCBpczogICIgPDwgdHlwZWlkKCZjb250YWluZWQ8VFtOXT46OmNvbnN0X2dldCkubmFtZSgpIDw8IGVuZGw7CisgICAgICBjb3V0IDw8ICJ0eXBlb2YgY29udGFpbmVkPCIgPDwgdHlwZWlkKFRbTl0pLm5hbWUoKSA8PCAiPjo6Y2FsbCBpczogICAgICAgIiA8PCB0eXBlaWQoJmNvbnRhaW5lZDxUW05dPjo6Y2FsbCkubmFtZSgpIDw8IGVuZGw7CisgICAgICBjb3V0IDw8IGVuZGw7CisgICB9Cit9OworI2VuZGlmCisKKy8vCisvLyBjaGVja193cmFwOgordGVtcGxhdGUgPGNsYXNzIFcsIGNsYXNzIFU+Cit2b2lkIGNoZWNrX3dyYXAoY29uc3QgVyYgdywgY29uc3QgVSYgdSkKK3sKKyAgIGNvdXQgPDwgImNoZWNraW5nICIgPDwgdHlwZWlkKFcpLm5hbWUoKSA8PCAiLi4uIiA8PCBlbmRsOworICAgQk9PU1RfQ0hFQ0sody52YWx1ZSgpID09IHUpOworfQorCisvLworLy8gY2hlY2tfbWFrZV9wYWlyOgorLy8gdmVyaWZpZXMgYmVoYXZpb3VyIG9mICJtYWtlX3BhaXIiOgorLy8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVLCBjbGFzcyBWPgordm9pZCBjaGVja19tYWtlX3BhaXIoVCBjLCBVIHUsIFYgdikKK3sKKyAgIGNvdXQgPDwgImNoZWNraW5nIHN0ZDo6cGFpcjwiIDw8IHR5cGVpZChjLmZpcnN0KS5uYW1lKCkgPDwgIiwgIiA8PCB0eXBlaWQoYy5zZWNvbmQpLm5hbWUoKSA8PCAiPi4uLiIgPDwgZW5kbDsKKyAgIEJPT1NUX0NIRUNLKGMuZmlyc3QgPT0gdSk7CisgICBCT09TVF9DSEVDSyhjLnNlY29uZCA9PSB2KTsKKyAgIGNvdXQgPDwgZW5kbDsKK30KKworCitzdHJ1Y3QgY29tcGFyaWJsZV9VRFQKK3sKKyAgIGludCBpXzsKKyAgIGNvbXBhcmlibGVfVURUKCkgOiBpXygyKXt9CisgICBjb21wYXJpYmxlX1VEVChjb25zdCBjb21wYXJpYmxlX1VEVCYgb3RoZXIpIDogaV8ob3RoZXIuaV8pe30KKyAgIGNvbXBhcmlibGVfVURUJiBvcGVyYXRvcj0oY29uc3QgY29tcGFyaWJsZV9VRFQmIG90aGVyKQorICAgeyAKKyAgICAgIGlfID0gb3RoZXIuaV87CisgICAgICByZXR1cm4gKnRoaXM7CisgICB9CisgICBib29sIG9wZXJhdG9yID09IChjb25zdCBjb21wYXJpYmxlX1VEVCYgdil7IHJldHVybiB2LmlfID09IGlfOyB9Cit9OworCitpbnQgbWFpbigpCit7CisgICBjYWxsX3RyYWl0c19jaGVja2VyPGNvbXBhcmlibGVfVURUPiBjMTsKKyAgIGNvbXBhcmlibGVfVURUIHU7CisgICBjMSh1KTsKKyAgIGNhbGxfdHJhaXRzX2NoZWNrZXI8aW50PiBjMjsKKyAgIGNhbGxfdHJhaXRzX2NoZWNrZXI8ZW51bV9VRFQ+IGMyYjsKKyAgIGludCBpID0gMjsKKyAgIGMyKGkpOworICAgYzJiKG9uZSk7CisgICBpbnQqIHBpID0gJmk7CisgICBpbnQgYVsyXSA9IHsxLDJ9OworI2lmIGRlZmluZWQoQk9PU1RfTVNWQzZfTUVNQkVSX1RFTVBMQVRFUykgJiYgIWRlZmluZWQoX19JQ0wpCisgICBjYWxsX3RyYWl0c19jaGVja2VyPGludCo+IGMzOworICAgYzMocGkpOworICAgY2FsbF90cmFpdHNfY2hlY2tlcjxpbnQmPiBjNDsKKyAgIGM0KGkpOworICAgY2FsbF90cmFpdHNfY2hlY2tlcjxjb25zdCBpbnQmPiBjNTsKKyAgIGM1KGkpOworI2lmICFkZWZpbmVkIChCT09TVF9OT19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZChfX01XRVJLU19fKSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKKyAgIGNhbGxfdHJhaXRzX2NoZWNrZXI8aW50WzJdPiBjNjsKKyAgIGM2KGEpOworI2VuZGlmCisjZW5kaWYKKworICAgY2hlY2tfd3JhcCh0ZXN0X3dyYXBfdHlwZSgyKSwgMik7CisjaWYgIWRlZmluZWQoQk9PU1RfTk9fVEVNUExBVEVfUEFSVElBTF9TUEVDSUFMSVpBVElPTikgJiYgIWRlZmluZWQoX19TVU5QUk9fQ0MpCisgICBjaGVja193cmFwKHRlc3Rfd3JhcF90eXBlKGEpLCBhKTsKKyAgIGNoZWNrX21ha2VfcGFpcih0ZXN0OjptYWtlX3BhaXIoYSwgYSksIGEsIGEpOworI2VuZGlmCisKKyAgIC8vIGN2LXF1YWxpZmllcnMgYXBwbGllZCB0byByZWZlcmVuY2UgdHlwZXMgc2hvdWxkIGhhdmUgbm8gZWZmZWN0CisgICAvLyBkZWNsYXJlIHRoZXNlIGhlcmUgZm9yIGxhdGVyIHVzZSB3aXRoIGlzX3JlZmVyZW5jZSBhbmQgcmVtb3ZlX3JlZmVyZW5jZToKKyAgIHR5cGVkZWYgaW50JiByX3R5cGU7CisgICB0eXBlZGVmIGNvbnN0IHJfdHlwZSBjcl90eXBlOworCisgICBCT09TVF9DSEVDS19UWVBFKGNvbXBhcmlibGVfVURULCBib29zdDo6Y2FsbF90cmFpdHM8Y29tcGFyaWJsZV9VRFQ+Ojp2YWx1ZV90eXBlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29tcGFyaWJsZV9VRFQmLCBib29zdDo6Y2FsbF90cmFpdHM8Y29tcGFyaWJsZV9VRFQ+OjpyZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBjb21wYXJpYmxlX1VEVCYsIGJvb3N0OjpjYWxsX3RyYWl0czxjb21wYXJpYmxlX1VEVD46OmNvbnN0X3JlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IGNvbXBhcmlibGVfVURUJiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGNvbXBhcmlibGVfVURUPjo6cGFyYW1fdHlwZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGludCwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludD46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQmLCBib29zdDo6Y2FsbF90cmFpdHM8aW50Pjo6cmVmZXJlbmNlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50JiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludD46OmNvbnN0X3JlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IGludCwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludD46OnBhcmFtX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQqLCBib29zdDo6Y2FsbF90cmFpdHM8aW50Kj46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQqJiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludCo+OjpyZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQqY29uc3QmLCBib29zdDo6Y2FsbF90cmFpdHM8aW50Kj46OmNvbnN0X3JlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGludCpjb25zdCwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludCo+OjpwYXJhbV90eXBlKTsKKyNpZiBkZWZpbmVkKEJPT1NUX01TVkM2X01FTUJFUl9URU1QTEFURVMpCisgICBCT09TVF9DSEVDS19UWVBFKGludCYsIGJvb3N0OjpjYWxsX3RyYWl0czxpbnQmPjo6dmFsdWVfdHlwZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGludCYsIGJvb3N0OjpjYWxsX3RyYWl0czxpbnQmPjo6cmVmZXJlbmNlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50JiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludCY+Ojpjb25zdF9yZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQmLCBib29zdDo6Y2FsbF90cmFpdHM8aW50Jj46OnBhcmFtX3R5cGUpOworI2lmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA8IDMpIHx8IChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPCAxKSkpCisgICBCT09TVF9DSEVDS19UWVBFKGludCYsIGJvb3N0OjpjYWxsX3RyYWl0czxjcl90eXBlPjo6dmFsdWVfdHlwZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGludCYsIGJvb3N0OjpjYWxsX3RyYWl0czxjcl90eXBlPjo6cmVmZXJlbmNlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50JiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGNyX3R5cGU+Ojpjb25zdF9yZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQmLCBib29zdDo6Y2FsbF90cmFpdHM8Y3JfdHlwZT46OnBhcmFtX3R5cGUpOworI2Vsc2UKKyAgIHN0ZDo6Y291dCA8PCAiWW91ciBjb21waWxlciBjYW5ub3QgaW5zdGFudGlhdGUgY2FsbF90cmFpdHM8aW50JmNvbnN0Piwgc2tpcHBpbmcgZm91ciB0ZXN0cyAoNCBlcnJvcnMpIiA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50JiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGNvbnN0IGludCY+Ojp2YWx1ZV90eXBlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50JiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGNvbnN0IGludCY+OjpyZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQmLCBib29zdDo6Y2FsbF90cmFpdHM8Y29uc3QgaW50Jj46OmNvbnN0X3JlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IGludCYsIGJvb3N0OjpjYWxsX3RyYWl0czxjb25zdCBpbnQmPjo6cGFyYW1fdHlwZSk7CisjaWZuZGVmIEJPT1NUX05PX1RFTVBMQVRFX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50KiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGludFszXT46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbnQoJilbM10sIGJvb3N0OjpjYWxsX3RyYWl0czxpbnRbM10+OjpyZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQoJilbM10sIGJvb3N0OjpjYWxsX3RyYWl0czxpbnRbM10+Ojpjb25zdF9yZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQqY29uc3QsIGJvb3N0OjpjYWxsX3RyYWl0czxpbnRbM10+OjpwYXJhbV90eXBlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW50KiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGNvbnN0IGludFszXT46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQoJilbM10sIGJvb3N0OjpjYWxsX3RyYWl0czxjb25zdCBpbnRbM10+OjpyZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQoJilbM10sIGJvb3N0OjpjYWxsX3RyYWl0czxjb25zdCBpbnRbM10+Ojpjb25zdF9yZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCBpbnQqY29uc3QsIGJvb3N0OjpjYWxsX3RyYWl0czxjb25zdCBpbnRbM10+OjpwYXJhbV90eXBlKTsKKyAgIC8vIHRlc3Qgd2l0aCBhYnN0cmFjdCBiYXNlIGNsYXNzOgorICAgQk9PU1RfQ0hFQ0tfVFlQRSh0ZXN0X2FiYzEsIGJvb3N0OjpjYWxsX3RyYWl0czx0ZXN0X2FiYzE+Ojp2YWx1ZV90eXBlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUodGVzdF9hYmMxJiwgYm9vc3Q6OmNhbGxfdHJhaXRzPHRlc3RfYWJjMT46OnJlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IHRlc3RfYWJjMSYsIGJvb3N0OjpjYWxsX3RyYWl0czx0ZXN0X2FiYzE+Ojpjb25zdF9yZWZlcmVuY2UpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShjb25zdCB0ZXN0X2FiYzEmLCBib29zdDo6Y2FsbF90cmFpdHM8dGVzdF9hYmMxPjo6cGFyYW1fdHlwZSk7CisjZWxzZQorICAgc3RkOjpjb3V0IDw8ICJZb3UncmUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpYXRpb24sIHNraXBwaW5nIDggdGVzdHMgKDggZXJyb3JzKSIgPDwgc3RkOjplbmRsOworI2VuZGlmCisjZWxzZQorICAgc3RkOjpjb3V0IDw8ICJZb3UncmUgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpYXRpb24sIHNraXBwaW5nIDIwIHRlc3RzICgyMCBlcnJvcnMpIiA8PCBzdGQ6OmVuZGw7CisjZW5kaWYKKyAgIC8vIHRlc3Qgd2l0aCBhbiBpbmNvbXBsZXRlIHR5cGU6CisgICBCT09TVF9DSEVDS19UWVBFKGluY29tcGxldGVfdHlwZSwgYm9vc3Q6OmNhbGxfdHJhaXRzPGluY29tcGxldGVfdHlwZT46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShpbmNvbXBsZXRlX3R5cGUmLCBib29zdDo6Y2FsbF90cmFpdHM8aW5jb21wbGV0ZV90eXBlPjo6cmVmZXJlbmNlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgaW5jb21wbGV0ZV90eXBlJiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGluY29tcGxldGVfdHlwZT46OmNvbnN0X3JlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IGluY29tcGxldGVfdHlwZSYsIGJvb3N0OjpjYWxsX3RyYWl0czxpbmNvbXBsZXRlX3R5cGU+OjpwYXJhbV90eXBlKTsKKyAgIC8vIHRlc3QgZW51bToKKyAgIEJPT1NUX0NIRUNLX1RZUEUoZW51bV9VRFQsIGJvb3N0OjpjYWxsX3RyYWl0czxlbnVtX1VEVD46OnZhbHVlX3R5cGUpOworICAgQk9PU1RfQ0hFQ0tfVFlQRShlbnVtX1VEVCYsIGJvb3N0OjpjYWxsX3RyYWl0czxlbnVtX1VEVD46OnJlZmVyZW5jZSk7CisgICBCT09TVF9DSEVDS19UWVBFKGNvbnN0IGVudW1fVURUJiwgYm9vc3Q6OmNhbGxfdHJhaXRzPGVudW1fVURUPjo6Y29uc3RfcmVmZXJlbmNlKTsKKyAgIEJPT1NUX0NIRUNLX1RZUEUoY29uc3QgZW51bV9VRFQsIGJvb3N0OjpjYWxsX3RyYWl0czxlbnVtX1VEVD46OnBhcmFtX3R5cGUpOworICAgcmV0dXJuIDA7Cit9CisKKy8vCisvLyBkZWZpbmUgY2FsbF90cmFpdHMgdGVzdHMgdG8gY2hlY2sgdGhhdCB0aGUgYXNzZXJ0aW9ucyBpbiB0aGUgZG9jcyBkbyBhY3R1YWxseSB3b3JrCisvLyB0aGlzIGlzIGFuIGNvbXBpbGUtdGltZSBvbmx5IHNldCBvZiB0ZXN0czoKKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBpc2FycmF5ID0gZmFsc2U+CitzdHJ1Y3QgY2FsbF90cmFpdHNfdGVzdAoreworICAgdHlwZWRlZiA6OmJvb3N0OjpjYWxsX3RyYWl0czxUPiBjdDsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY3Q6OnBhcmFtX3R5cGUgcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY3Q6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgICB0eXBlZGVmIHR5cGVuYW1lIGN0Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjdDo6dmFsdWVfdHlwZSB2YWx1ZV90eXBlOworICAgc3RhdGljIHZvaWQgYXNzZXJ0X2NvbnN0cnVjdChwYXJhbV90eXBlIHZhbCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBpc2FycmF5Pgordm9pZCBjYWxsX3RyYWl0c190ZXN0PFQsIGlzYXJyYXk+Ojphc3NlcnRfY29uc3RydWN0KHR5cGVuYW1lIGNhbGxfdHJhaXRzX3Rlc3Q8VCwgaXNhcnJheT46OnBhcmFtX3R5cGUgdmFsKQoreworICAgLy8KKyAgIC8vIHRoaXMgaXMgdG8gY2hlY2sgdGhhdCB0aGUgY2FsbF90cmFpdHMgYXNzZXJ0aW9ucyBhcmUgdmFsaWQ6CisgICBUIHQodmFsKTsKKyAgIHZhbHVlX3R5cGUgdih0KTsKKyAgIHJlZmVyZW5jZSByKHQpOworICAgY29uc3RfcmVmZXJlbmNlIGNyKHQpOworICAgcGFyYW1fdHlwZSBwKHQpOworICAgdmFsdWVfdHlwZSB2Mih2KTsKKyAgIHZhbHVlX3R5cGUgdjMocik7CisgICB2YWx1ZV90eXBlIHY0KHApOworICAgcmVmZXJlbmNlIHIyKHYpOworICAgcmVmZXJlbmNlIHIzKHIpOworICAgY29uc3RfcmVmZXJlbmNlIGNyMih2KTsKKyAgIGNvbnN0X3JlZmVyZW5jZSBjcjMocik7CisgICBjb25zdF9yZWZlcmVuY2UgY3I0KGNyKTsKKyAgIGNvbnN0X3JlZmVyZW5jZSBjcjUocCk7CisgICBwYXJhbV90eXBlIHAyKHYpOworICAgcGFyYW1fdHlwZSBwMyhyKTsKKyAgIHBhcmFtX3R5cGUgcDQocCk7CisgICAKKyAgIHVudXNlZF92YXJpYWJsZSh2Mik7CisgICB1bnVzZWRfdmFyaWFibGUodjMpOworICAgdW51c2VkX3ZhcmlhYmxlKHY0KTsKKyAgIHVudXNlZF92YXJpYWJsZShyMik7CisgICB1bnVzZWRfdmFyaWFibGUocjMpOworICAgdW51c2VkX3ZhcmlhYmxlKGNyMik7CisgICB1bnVzZWRfdmFyaWFibGUoY3IzKTsKKyAgIHVudXNlZF92YXJpYWJsZShjcjQpOworICAgdW51c2VkX3ZhcmlhYmxlKGNyNSk7CisgICB1bnVzZWRfdmFyaWFibGUocDIpOworICAgdW51c2VkX3ZhcmlhYmxlKHAzKTsKKyAgIHVudXNlZF92YXJpYWJsZShwNCk7Cit9CisjaWZuZGVmIEJPT1NUX05PX1RFTVBMQVRFX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNhbGxfdHJhaXRzX3Rlc3Q8VCwgdHJ1ZT4KK3sKKyAgIHR5cGVkZWYgOjpib29zdDo6Y2FsbF90cmFpdHM8VD4gY3Q7CisgICB0eXBlZGVmIHR5cGVuYW1lIGN0OjpwYXJhbV90eXBlIHBhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGN0OjpyZWZlcmVuY2UgcmVmZXJlbmNlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjdDo6Y29uc3RfcmVmZXJlbmNlIGNvbnN0X3JlZmVyZW5jZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY3Q6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgIHN0YXRpYyB2b2lkIGFzc2VydF9jb25zdHJ1Y3QocGFyYW1fdHlwZSB2YWwpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIGNhbGxfdHJhaXRzX3Rlc3Q8VCwgdHJ1ZT46OmFzc2VydF9jb25zdHJ1Y3QodHlwZW5hbWUgYm9vc3Q6OmNhbGxfdHJhaXRzPFQ+OjpwYXJhbV90eXBlIHZhbCkKK3sKKyAgIC8vCisgICAvLyB0aGlzIGlzIHRvIGNoZWNrIHRoYXQgdGhlIGNhbGxfdHJhaXRzIGFzc2VydGlvbnMgYXJlIHZhbGlkOgorICAgVCB0OworICAgdmFsdWVfdHlwZSB2KHQpOworICAgdmFsdWVfdHlwZSB2NSh2YWwpOworICAgcmVmZXJlbmNlIHIgPSB0OworICAgY29uc3RfcmVmZXJlbmNlIGNyID0gdDsKKyAgIHJlZmVyZW5jZSByMiA9IHI7CisgICAjaWZuZGVmIF9fQk9STEFORENfXworICAgLy8gQysrIEJ1aWxkZXIgYnVnbGV0OgorICAgY29uc3RfcmVmZXJlbmNlIGNyMiA9IHI7CisgICAjZW5kaWYKKyAgIHBhcmFtX3R5cGUgcCh0KTsKKyAgIHZhbHVlX3R5cGUgdjIodik7CisgICBjb25zdF9yZWZlcmVuY2UgY3IzID0gY3I7CisgICB2YWx1ZV90eXBlIHYzKHIpOworICAgdmFsdWVfdHlwZSB2NChwKTsKKyAgIHBhcmFtX3R5cGUgcDIodik7CisgICBwYXJhbV90eXBlIHAzKHIpOworICAgcGFyYW1fdHlwZSBwNChwKTsKKyAgIAorICAgdW51c2VkX3ZhcmlhYmxlKHYyKTsKKyAgIHVudXNlZF92YXJpYWJsZSh2Myk7CisgICB1bnVzZWRfdmFyaWFibGUodjQpOworICAgdW51c2VkX3ZhcmlhYmxlKHY1KTsKKyNpZm5kZWYgX19CT1JMQU5EQ19fCisgICB1bnVzZWRfdmFyaWFibGUocjIpOworICAgdW51c2VkX3ZhcmlhYmxlKGNyMik7CisjZW5kaWYKKyAgIHVudXNlZF92YXJpYWJsZShjcjMpOworICAgdW51c2VkX3ZhcmlhYmxlKHAyKTsKKyAgIHVudXNlZF92YXJpYWJsZShwMyk7CisgICB1bnVzZWRfdmFyaWFibGUocDQpOworfQorI2VuZGlmIC8vQk9PU1RfTk9fVEVNUExBVEVfUEFSVElBTF9TUEVDSUFMSVpBVElPTgorLy8KKy8vIG5vdyBjaGVjayBjYWxsX3RyYWl0cyBhc3NlcnRpb25zIGJ5IGluc3RhbnRpYXRpbmcgY2FsbF90cmFpdHNfdGVzdDoKK3RlbXBsYXRlIHN0cnVjdCBjYWxsX3RyYWl0c190ZXN0PGludD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgY2FsbF90cmFpdHNfdGVzdDxjb25zdCBpbnQ+OwordGVtcGxhdGUgc3RydWN0IGNhbGxfdHJhaXRzX3Rlc3Q8aW50Kj47CisjaWYgZGVmaW5lZChCT09TVF9NU1ZDNl9NRU1CRVJfVEVNUExBVEVTKQordGVtcGxhdGUgc3RydWN0IGNhbGxfdHJhaXRzX3Rlc3Q8aW50Jj47Cit0ZW1wbGF0ZSBzdHJ1Y3QgY2FsbF90cmFpdHNfdGVzdDxjb25zdCBpbnQmPjsKKyNpZiAhZGVmaW5lZChCT09TVF9OT19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OKSAmJiAhZGVmaW5lZChfX1NVTlBST19DQykKK3RlbXBsYXRlIHN0cnVjdCBjYWxsX3RyYWl0c190ZXN0PGludFsyXSwgdHJ1ZT47CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS90ZXN0L2NvbXByZXNzZWRfcGFpcl90ZXN0LmNwcCBiL3Rlc3QvY29tcHJlc3NlZF9wYWlyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTBiMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbXByZXNzZWRfcGFpcl90ZXN0LmNwcApAQCAtMCwwICsxLDM4NyBAQAorLy8gIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXIgdGVzdCBwcm9ncmFtICAgCisgICAgCisvLyAgKEMpIENvcHlyaWdodCBKb2huIE1hZGRvY2sgMjAwMC4gCisvLyAgVXNlLCBtb2RpZmljYXRpb24gYW5kIGRpc3RyaWJ1dGlvbiBhcmUgc3ViamVjdCB0byB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwKKy8vICBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkuCisKKy8vIHN0YW5kYWxvbmUgdGVzdCBwcm9ncmFtIGZvciA8Ym9vc3QvY29tcHJlc3NlZF9wYWlyLmhwcD4KKy8vIFJldmlzZWQgMDMgT2N0IDIwMDA6IAorLy8gICAgRW5hYmxlZCB0ZXN0cyBmb3IgVkM2LgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPGJvb3N0L2NvbXByZXNzZWRfcGFpci5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKwordXNpbmcgbmFtZXNwYWNlIGJvb3N0OworCitzdHJ1Y3QgZW1wdHlfVURUCit7CisgICB+ZW1wdHlfVURUKCl7fTsKKyAgIGVtcHR5X1VEVCYgb3BlcmF0b3I9KGNvbnN0IGVtcHR5X1VEVCYpeyByZXR1cm4gKnRoaXM7IH0KKyAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBlbXB0eV9VRFQmKWNvbnN0CisgICB7IHJldHVybiB0cnVlOyB9Cit9Oworc3RydWN0IGVtcHR5X1BPRF9VRFQKK3sKKyAgIGVtcHR5X1BPRF9VRFQmIG9wZXJhdG9yPShjb25zdCBlbXB0eV9QT0RfVURUJil7IHJldHVybiAqdGhpczsgfQorICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGVtcHR5X1BPRF9VRFQmKWNvbnN0CisgICB7IHJldHVybiB0cnVlOyB9Cit9OworCitzdHJ1Y3Qgbm9uX2VtcHR5MQoreyAKKyAgIGludCBpOworICAgbm9uX2VtcHR5MSgpIDogaSgxKXt9CisgICBub25fZW1wdHkxKGludCB2KSA6IGkodil7fQorICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBub25fZW1wdHkxJiBhLCBjb25zdCBub25fZW1wdHkxJiBiKQorICAgeyByZXR1cm4gYS5pID09IGIuaTsgfQorfTsKKworc3RydWN0IG5vbl9lbXB0eTIKK3sgCisgICBpbnQgaTsKKyAgIG5vbl9lbXB0eTIoKSA6IGkoMyl7fQorICAgbm9uX2VtcHR5MihpbnQgdikgOiBpKHYpe30KKyAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgbm9uX2VtcHR5MiYgYSwgY29uc3Qgbm9uX2VtcHR5MiYgYikKKyAgIHsgcmV0dXJuIGEuaSA9PSBiLmk7IH0KK307CisKKyNpZmRlZiBfX0dOVUNfXwordXNpbmcgc3RkOjpzd2FwOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitzdHJ1Y3QgY29tcHJlc3NlZF9wYWlyX3Rlc3RlcgoreworICAgLy8gZGVmaW5lIHRoZSB0eXBlcyB3ZSBuZWVkOgorICAgdHlwZWRlZiBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlOworICAgdHlwZWRlZiBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpwYXJhbV90eXBlICAgICAgc2Vjb25kX3BhcmFtX3R5cGU7CisgICAvLyBkZWZpbmUgb3VyIHRlc3QgcHJvYzoKKyAgIHN0YXRpYyB2b2lkIHRlc3QoZmlyc3RfcGFyYW1fdHlwZSBwMSwgc2Vjb25kX3BhcmFtX3R5cGUgcDIsIGZpcnN0X3BhcmFtX3R5cGUgcDMsIHNlY29uZF9wYXJhbV90eXBlIHA0KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+Cit2b2lkIGNvbXByZXNzZWRfcGFpcl90ZXN0ZXI8VDEsIFQyPjo6dGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSBwMywgc2Vjb25kX3BhcmFtX3R5cGUgcDQpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAvLyBnY2MgMi45MCBjYW4ndCBjb3BlIHdpdGggZnVuY3Rpb24gc2NvcGUgdXNpbmcKKyAgIC8vIGRlY2xhcmF0aW9ucywgYW5kIGdlbmVyYXRlcyBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvci4uLgorICAgdXNpbmcgc3RkOjpzd2FwOworI2VuZGlmCisgICAvLyBkZWZhdWx0IGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMTsKKyAgIC8vIGZpcnN0IHBhcmFtIGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMihwMSk7CisgICBjcDIuc2Vjb25kKCkgPSBwMjsKKyAgIEJPT1NUX1RFU1QoY3AyLmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcDIuc2Vjb25kKCkgPT0gcDIpOworICAgLy8gc2Vjb25kIHBhcmFtIGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMyhwMik7CisgICBjcDMuZmlyc3QoKSA9IHAxOworICAgQk9PU1RfVEVTVChjcDMuc2Vjb25kKCkgPT0gcDIpOworICAgQk9PU1RfVEVTVChjcDMuZmlyc3QoKSA9PSBwMSk7CisgICAvLyBib3RoIHBhcmFtIGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwNChwMSwgcDIpOworICAgQk9PU1RfVEVTVChjcDQuZmlyc3QoKSA9PSBwMSk7CisgICBCT09TVF9URVNUKGNwNC5zZWNvbmQoKSA9PSBwMik7CisgICBib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiBjcDUocDMsIHA0KTsKKyAgIEJPT1NUX1RFU1QoY3A1LmZpcnN0KCkgPT0gcDMpOworICAgQk9PU1RfVEVTVChjcDUuc2Vjb25kKCkgPT0gcDQpOworICAgLy8gY2hlY2sgY29uc3QgbWVtYmVyczoKKyAgIGNvbnN0IGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+JiBjcHIxID0gY3A0OworICAgQk9PU1RfVEVTVChjcHIxLmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcHIxLnNlY29uZCgpID09IHAyKTsKKworICAgLy8gY29weSBjb25zdHJ1Y3Q6CisgICBib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiBjcDYoY3A0KTsKKyAgIEJPT1NUX1RFU1QoY3A2LmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcDYuc2Vjb25kKCkgPT0gcDIpOworICAgLy8gYXNzaWdubWVudDoKKyAgIGNwMSA9IGNwNDsKKyAgIEJPT1NUX1RFU1QoY3AxLmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcDEuc2Vjb25kKCkgPT0gcDIpOworICAgY3AxID0gY3A1OworICAgQk9PU1RfVEVTVChjcDEuZmlyc3QoKSA9PSBwMyk7CisgICBCT09TVF9URVNUKGNwMS5zZWNvbmQoKSA9PSBwNCk7CisgICAvLyBzd2FwOgorICAgY3A0LnN3YXAoY3A1KTsKKyAgIEJPT1NUX1RFU1QoY3A0LmZpcnN0KCkgPT0gcDMpOworICAgQk9PU1RfVEVTVChjcDQuc2Vjb25kKCkgPT0gcDQpOworICAgQk9PU1RfVEVTVChjcDUuZmlyc3QoKSA9PSBwMSk7CisgICBCT09TVF9URVNUKGNwNS5zZWNvbmQoKSA9PSBwMik7CisgICBzd2FwKGNwNCxjcDUpOworICAgQk9PU1RfVEVTVChjcDQuZmlyc3QoKSA9PSBwMSk7CisgICBCT09TVF9URVNUKGNwNC5zZWNvbmQoKSA9PSBwMik7CisgICBCT09TVF9URVNUKGNwNS5maXJzdCgpID09IHAzKTsKKyAgIEJPT1NUX1RFU1QoY3A1LnNlY29uZCgpID09IHA0KTsKK30KKworLy8KKy8vIHRlc3RzIGZvciBjYXNlIHdoZXJlIG9uZSBvciBib3RoIAorLy8gcGFyYW1ldGVycyBhcmUgcmVmZXJlbmNlIHR5cGVzOgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitzdHJ1Y3QgY29tcHJlc3NlZF9wYWlyX3JlZmVyZW5jZV90ZXN0ZXIKK3sKKyAgIC8vIGRlZmluZSB0aGUgdHlwZXMgd2UgbmVlZDoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgLy8gZGVmaW5lIG91ciB0ZXN0IHByb2M6CisgICBzdGF0aWMgdm9pZCB0ZXN0KGZpcnN0X3BhcmFtX3R5cGUgcDEsIHNlY29uZF9wYXJhbV90eXBlIHAyLCBmaXJzdF9wYXJhbV90eXBlIHAzLCBzZWNvbmRfcGFyYW1fdHlwZSBwNCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgordm9pZCBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlX3Rlc3RlcjxUMSwgVDI+Ojp0ZXN0KGZpcnN0X3BhcmFtX3R5cGUgcDEsIHNlY29uZF9wYXJhbV90eXBlIHAyLCBmaXJzdF9wYXJhbV90eXBlIHAzLCBzZWNvbmRfcGFyYW1fdHlwZSBwNCkKK3sKKyNpZm5kZWYgX19HTlVDX18KKyAgIC8vIGdjYyAyLjkwIGNhbid0IGNvcGUgd2l0aCBmdW5jdGlvbiBzY29wZSB1c2luZworICAgLy8gZGVjbGFyYXRpb25zLCBhbmQgZ2VuZXJhdGVzIGFuIGludGVybmFsIGNvbXBpbGVyIGVycm9yLi4uCisgICB1c2luZyBzdGQ6OnN3YXA7CisjZW5kaWYKKyAgIC8vIGJvdGggcGFyYW0gY29uc3RydWN0OgorICAgYm9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4gY3A0KHAxLCBwMik7CisgICBCT09TVF9URVNUKGNwNC5maXJzdCgpID09IHAxKTsKKyAgIEJPT1NUX1RFU1QoY3A0LnNlY29uZCgpID09IHAyKTsKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwNShwMywgcDQpOworICAgQk9PU1RfVEVTVChjcDUuZmlyc3QoKSA9PSBwMyk7CisgICBCT09TVF9URVNUKGNwNS5zZWNvbmQoKSA9PSBwNCk7CisgICAvLyBjaGVjayBjb25zdCBtZW1iZXJzOgorICAgY29uc3QgYm9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mIGNwcjEgPSBjcDQ7CisgICBCT09TVF9URVNUKGNwcjEuZmlyc3QoKSA9PSBwMSk7CisgICBCT09TVF9URVNUKGNwcjEuc2Vjb25kKCkgPT0gcDIpOworCisgICAvLyBjb3B5IGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwNihjcDQpOworICAgQk9PU1RfVEVTVChjcDYuZmlyc3QoKSA9PSBwMSk7CisgICBCT09TVF9URVNUKGNwNi5zZWNvbmQoKSA9PSBwMik7CisgICAvLyBhc3NpZ25tZW50OgorICAgLy8gVkM2IGJ1ZzoKKyAgIC8vIFdoZW4gc2Vjb25kKCkgaXMgYW4gZW1wdHkgY2xhc3MsIFZDNiBwZXJmb3JtcyB0aGUKKyAgIC8vIGFzc2lnbm1lbnQgYnkgZG9pbmcgYSBtZW1jcHkgLSBldmVuIHRob3VnaCB0aGUgZW1wdHkKKyAgIC8vIGNsYXNzIGlzIHJlYWxseSBhIHplcm8gc2l6ZWQgYmFzZSBjbGFzcywgdGhlIHJlc3VsdAorICAgLy8gaXMgdGhhdCB0aGUgbWVtb3J5IG9mIGZpcnN0KCkgZ2V0cyB0cmFtcGxlZCBvdmVyLgorICAgLy8gU2ltaWxhciBhcmd1bWVudHMgYXBwbHkgdG8gdGhlIGNhc2UgdGhhdCBmaXJzdCgpIGlzIAorICAgLy8gYW4gZW1wdHkgYmFzZSBjbGFzcy4KKyAgIC8vIFN0cmFuZ2VseSB0aGUgcHJvYmxlbSBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgY29tcGlsZXIKKyAgIC8vIHNldHRpbmdzIC0gc29tZSBnZW5lcmF0ZSB0aGUgcHJvYmxlbSBvdGhlcnMgZG8gbm90LgorICAgY3A0LmZpcnN0KCkgPSBwMzsKKyAgIGNwNC5zZWNvbmQoKSA9IHA0OworICAgQk9PU1RfVEVTVChjcDQuZmlyc3QoKSA9PSBwMyk7CisgICBCT09TVF9URVNUKGNwNC5zZWNvbmQoKSA9PSBwNCk7Cit9CisvLworLy8gc3VwcGxpbWVudGFyeSB0ZXN0cyBmb3IgY2FzZSB3aGVyZSBmaXJzdCBhcmcgb25seSBpcyBhIHJlZmVyZW5jZSB0eXBlOgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+CitzdHJ1Y3QgY29tcHJlc3NlZF9wYWlyX3JlZmVyZW5jZTFfdGVzdGVyCit7CisgICAvLyBkZWZpbmUgdGhlIHR5cGVzIHdlIG5lZWQ6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIC8vIGRlZmluZSBvdXIgdGVzdCBwcm9jOgorICAgc3RhdGljIHZvaWQgdGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSBwMywgc2Vjb25kX3BhcmFtX3R5cGUgcDQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3ZvaWQgY29tcHJlc3NlZF9wYWlyX3JlZmVyZW5jZTFfdGVzdGVyPFQxLCBUMj46OnRlc3QoZmlyc3RfcGFyYW1fdHlwZSBwMSwgc2Vjb25kX3BhcmFtX3R5cGUgcDIsIGZpcnN0X3BhcmFtX3R5cGUsIHNlY29uZF9wYXJhbV90eXBlKQoreworI2lmbmRlZiBCT09TVF9OT19URU1QTEFURV9QQVJUSUFMX1NQRUNJQUxJWkFUSU9OCisgICAvLyBmaXJzdCBwYXJhbSBjb25zdHJ1Y3Q6CisgICBib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiBjcDIocDEpOworICAgY3AyLnNlY29uZCgpID0gcDI7CisgICBCT09TVF9URVNUKGNwMi5maXJzdCgpID09IHAxKTsKKyAgIEJPT1NUX1RFU1QoY3AyLnNlY29uZCgpID09IHAyKTsKKyNlbmRpZgorfQorLy8KKy8vIHN1cHBsaW1lbnRhcnkgdGVzdHMgZm9yIGNhc2Ugd2hlcmUgc2Vjb25kIGFyZyBvbmx5IGlzIGEgcmVmZXJlbmNlIHR5cGU6CisvLwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlMl90ZXN0ZXIKK3sKKyAgIC8vIGRlZmluZSB0aGUgdHlwZXMgd2UgbmVlZDoKKyAgIHR5cGVkZWYgVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdHlwZTsKKyAgIHR5cGVkZWYgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPGZpcnN0X3R5cGU+OjpwYXJhbV90eXBlICAgICAgIGZpcnN0X3BhcmFtX3R5cGU7CisgICB0eXBlZGVmIHR5cGVuYW1lIGNhbGxfdHJhaXRzPHNlY29uZF90eXBlPjo6cGFyYW1fdHlwZSAgICAgIHNlY29uZF9wYXJhbV90eXBlOworICAgLy8gZGVmaW5lIG91ciB0ZXN0IHByb2M6CisgICBzdGF0aWMgdm9pZCB0ZXN0KGZpcnN0X3BhcmFtX3R5cGUgcDEsIHNlY29uZF9wYXJhbV90eXBlIHAyLCBmaXJzdF9wYXJhbV90eXBlIHAzLCBzZWNvbmRfcGFyYW1fdHlwZSBwNCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgordm9pZCBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlMl90ZXN0ZXI8VDEsIFQyPjo6dGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSwgc2Vjb25kX3BhcmFtX3R5cGUpCit7CisjaWZuZGVmIEJPT1NUX05PX1RFTVBMQVRFX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04KKyAgIC8vIHNlY29uZCBwYXJhbSBjb25zdHJ1Y3Q6CisgICBib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiBjcDMocDIpOworICAgY3AzLmZpcnN0KCkgPSBwMTsKKyAgIEJPT1NUX1RFU1QoY3AzLnNlY29uZCgpID09IHAyKTsKKyAgIEJPT1NUX1RFU1QoY3AzLmZpcnN0KCkgPT0gcDEpOworI2VuZGlmCit9CisKKy8vCisvLyB0ZXN0cyBmb3Igd2hlcmUgb25lIG9yIHRoZSBvdGhlciBwYXJhbWV0ZXIgaXMgYW4gYXJyYXk6CisvLwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfYXJyYXkxX3Rlc3RlcgoreworICAgLy8gZGVmaW5lIHRoZSB0eXBlcyB3ZSBuZWVkOgorICAgdHlwZWRlZiBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90eXBlOworICAgdHlwZWRlZiBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8Zmlyc3RfdHlwZT46OnBhcmFtX3R5cGUgICAgICAgZmlyc3RfcGFyYW1fdHlwZTsKKyAgIHR5cGVkZWYgdHlwZW5hbWUgY2FsbF90cmFpdHM8c2Vjb25kX3R5cGU+OjpwYXJhbV90eXBlICAgICAgc2Vjb25kX3BhcmFtX3R5cGU7CisgICAvLyBkZWZpbmUgb3VyIHRlc3QgcHJvYzoKKyAgIHN0YXRpYyB2b2lkIHRlc3QoZmlyc3RfcGFyYW1fdHlwZSBwMSwgc2Vjb25kX3BhcmFtX3R5cGUgcDIsIGZpcnN0X3BhcmFtX3R5cGUgcDMsIHNlY29uZF9wYXJhbV90eXBlIHA0KTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUMSwgY2xhc3MgVDI+Cit2b2lkIGNvbXByZXNzZWRfcGFpcl9hcnJheTFfdGVzdGVyPFQxLCBUMj46OnRlc3QoZmlyc3RfcGFyYW1fdHlwZSBwMSwgc2Vjb25kX3BhcmFtX3R5cGUgcDIsIGZpcnN0X3BhcmFtX3R5cGUsIHNlY29uZF9wYXJhbV90eXBlKQoreworICAvLyBkZWZhdWx0IGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMTsKKyAgIC8vIHNlY29uZCBwYXJhbSBjb25zdHJ1Y3Q6CisgICBib29zdDo6Y29tcHJlc3NlZF9wYWlyPFQxLFQyPiBjcDMocDIpOworICAgY3AzLmZpcnN0KClbMF0gPSBwMVswXTsKKyAgIEJPT1NUX1RFU1QoY3AzLnNlY29uZCgpID09IHAyKTsKKyAgIEJPT1NUX1RFU1QoY3AzLmZpcnN0KClbMF0gPT0gcDFbMF0pOworICAgLy8gY2hlY2sgY29uc3QgbWVtYmVyczoKKyAgIGNvbnN0IGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+JiBjcHIxID0gY3AzOworICAgQk9PU1RfVEVTVChjcHIxLmZpcnN0KClbMF0gPT0gcDFbMF0pOworICAgQk9PU1RfVEVTVChjcHIxLnNlY29uZCgpID09IHAyKTsKKworICAgQk9PU1RfVEVTVChzaXplb2YoVDEpID09IHNpemVvZihjcDEuZmlyc3QoKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgorc3RydWN0IGNvbXByZXNzZWRfcGFpcl9hcnJheTJfdGVzdGVyCit7CisgICAvLyBkZWZpbmUgdGhlIHR5cGVzIHdlIG5lZWQ6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIC8vIGRlZmluZSBvdXIgdGVzdCBwcm9jOgorICAgc3RhdGljIHZvaWQgdGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSBwMywgc2Vjb25kX3BhcmFtX3R5cGUgcDQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3ZvaWQgY29tcHJlc3NlZF9wYWlyX2FycmF5Ml90ZXN0ZXI8VDEsIFQyPjo6dGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSwgc2Vjb25kX3BhcmFtX3R5cGUpCit7CisgICAvLyBkZWZhdWx0IGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMTsKKyAgIC8vIGZpcnN0IHBhcmFtIGNvbnN0cnVjdDoKKyAgIGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+IGNwMihwMSk7CisgICBjcDIuc2Vjb25kKClbMF0gPSBwMlswXTsKKyAgIEJPT1NUX1RFU1QoY3AyLmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcDIuc2Vjb25kKClbMF0gPT0gcDJbMF0pOworICAgLy8gY2hlY2sgY29uc3QgbWVtYmVyczoKKyAgIGNvbnN0IGJvb3N0Ojpjb21wcmVzc2VkX3BhaXI8VDEsVDI+JiBjcHIxID0gY3AyOworICAgQk9PU1RfVEVTVChjcHIxLmZpcnN0KCkgPT0gcDEpOworICAgQk9PU1RfVEVTVChjcHIxLnNlY29uZCgpWzBdID09IHAyWzBdKTsKKworICAgQk9PU1RfVEVTVChzaXplb2YoVDIpID09IHNpemVvZihjcDEuc2Vjb25kKCkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3N0cnVjdCBjb21wcmVzc2VkX3BhaXJfYXJyYXlfdGVzdGVyCit7CisgICAvLyBkZWZpbmUgdGhlIHR5cGVzIHdlIG5lZWQ6CisgICB0eXBlZGVmIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3R5cGU7CisgICB0eXBlZGVmIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxmaXJzdF90eXBlPjo6cGFyYW1fdHlwZSAgICAgICBmaXJzdF9wYXJhbV90eXBlOworICAgdHlwZWRlZiB0eXBlbmFtZSBjYWxsX3RyYWl0czxzZWNvbmRfdHlwZT46OnBhcmFtX3R5cGUgICAgICBzZWNvbmRfcGFyYW1fdHlwZTsKKyAgIC8vIGRlZmluZSBvdXIgdGVzdCBwcm9jOgorICAgc3RhdGljIHZvaWQgdGVzdChmaXJzdF9wYXJhbV90eXBlIHAxLCBzZWNvbmRfcGFyYW1fdHlwZSBwMiwgZmlyc3RfcGFyYW1fdHlwZSBwMywgc2Vjb25kX3BhcmFtX3R5cGUgcDQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KK3ZvaWQgY29tcHJlc3NlZF9wYWlyX2FycmF5X3Rlc3RlcjxUMSwgVDI+Ojp0ZXN0KGZpcnN0X3BhcmFtX3R5cGUgcDEsIHNlY29uZF9wYXJhbV90eXBlIHAyLCBmaXJzdF9wYXJhbV90eXBlLCBzZWNvbmRfcGFyYW1fdHlwZSkKK3sKKyAgIC8vIGRlZmF1bHQgY29uc3RydWN0OgorICAgYm9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4gY3AxOworICAgY3AxLmZpcnN0KClbMF0gPSBwMVswXTsKKyAgIGNwMS5zZWNvbmQoKVswXSA9IHAyWzBdOworICAgQk9PU1RfVEVTVChjcDEuZmlyc3QoKVswXSA9PSBwMVswXSk7CisgICBCT09TVF9URVNUKGNwMS5zZWNvbmQoKVswXSA9PSBwMlswXSk7CisgICAvLyBjaGVjayBjb25zdCBtZW1iZXJzOgorICAgY29uc3QgYm9vc3Q6OmNvbXByZXNzZWRfcGFpcjxUMSxUMj4mIGNwcjEgPSBjcDE7CisgICBCT09TVF9URVNUKGNwcjEuZmlyc3QoKVswXSA9PSBwMVswXSk7CisgICBCT09TVF9URVNUKGNwcjEuc2Vjb25kKClbMF0gPT0gcDJbMF0pOworCisgICBCT09TVF9URVNUKHNpemVvZihUMSkgPT0gc2l6ZW9mKGNwMS5maXJzdCgpKSk7CisgICBCT09TVF9URVNUKHNpemVvZihUMikgPT0gc2l6ZW9mKGNwMS5zZWNvbmQoKSkpOworfQorCitpbnQgbWFpbigpCit7CisgICAvLyBkZWNsYXJlIHNvbWUgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIHRlc3RlcjoKKyAgIG5vbl9lbXB0eTEgbmUxKDIpOworICAgbm9uX2VtcHR5MSBuZTIoMyk7CisgICBub25fZW1wdHkyIG5lMyg0KTsKKyAgIG5vbl9lbXB0eTIgbmU0KDUpOworICAgZW1wdHlfUE9EX1VEVCAgZTE7CisgICBlbXB0eV9VRFQgICAgICBlMjsKKworICAgLy8gVDEgIT0gVDIsIGJvdGggbm9uLWVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfdGVzdGVyPG5vbl9lbXB0eTEsbm9uX2VtcHR5Mj46OnRlc3QobmUxLCBuZTMsIG5lMiwgbmU0KTsKKyAgIC8vIFQxICE9IFQyLCBUMiBlbXB0eQorICAgY29tcHJlc3NlZF9wYWlyX3Rlc3Rlcjxub25fZW1wdHkxLGVtcHR5X1BPRF9VRFQ+Ojp0ZXN0KG5lMSwgZTEsIG5lMiwgZTEpOworICAgLy8gVDEgIT0gVDIsIFQxIGVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfdGVzdGVyPGVtcHR5X1BPRF9VRFQsbm9uX2VtcHR5Mj46OnRlc3QoZTEsIG5lMywgZTEsIG5lNCk7CisgICAvLyBUMSAhPSBUMiwgYm90aCBlbXB0eQorICAgY29tcHJlc3NlZF9wYWlyX3Rlc3RlcjxlbXB0eV9QT0RfVURULGVtcHR5X1VEVD46OnRlc3QoZTEsIGUyLCBlMSwgZTIpOworICAgLy8gVDEgPT0gVDIsIGJvdGggbm9uLWVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfdGVzdGVyPG5vbl9lbXB0eTEsbm9uX2VtcHR5MT46OnRlc3QobmUxLCBuZTEsIG5lMiwgbmUyKTsKKyAgIC8vIFQxID09IFQyLCBib3RoIGVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfdGVzdGVyPGVtcHR5X1VEVCxlbXB0eV9VRFQ+Ojp0ZXN0KGUyLCBlMiwgZTIsIGUyKTsKKworCisgICAvLyB0ZXN0IHJlZmVyZW5jZXM6CisKKyAgIC8vIFQxICE9IFQyLCBib3RoIG5vbi1lbXB0eQorICAgY29tcHJlc3NlZF9wYWlyX3JlZmVyZW5jZV90ZXN0ZXI8bm9uX2VtcHR5MSYsbm9uX2VtcHR5Mj46OnRlc3QobmUxLCBuZTMsIG5lMiwgbmU0KTsKKyAgIGNvbXByZXNzZWRfcGFpcl9yZWZlcmVuY2VfdGVzdGVyPG5vbl9lbXB0eTEsbm9uX2VtcHR5MiY+Ojp0ZXN0KG5lMSwgbmUzLCBuZTIsIG5lNCk7CisgICBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlMV90ZXN0ZXI8bm9uX2VtcHR5MSYsbm9uX2VtcHR5Mj46OnRlc3QobmUxLCBuZTMsIG5lMiwgbmU0KTsKKyAgIGNvbXByZXNzZWRfcGFpcl9yZWZlcmVuY2UyX3Rlc3Rlcjxub25fZW1wdHkxLG5vbl9lbXB0eTImPjo6dGVzdChuZTEsIG5lMywgbmUyLCBuZTQpOworICAgLy8gVDEgIT0gVDIsIFQyIGVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlX3Rlc3Rlcjxub25fZW1wdHkxJixlbXB0eV9QT0RfVURUPjo6dGVzdChuZTEsIGUxLCBuZTIsIGUxKTsKKyAgIGNvbXByZXNzZWRfcGFpcl9yZWZlcmVuY2UxX3Rlc3Rlcjxub25fZW1wdHkxJixlbXB0eV9QT0RfVURUPjo6dGVzdChuZTEsIGUxLCBuZTIsIGUxKTsKKyAgIC8vIFQxICE9IFQyLCBUMSBlbXB0eQorICAgY29tcHJlc3NlZF9wYWlyX3JlZmVyZW5jZV90ZXN0ZXI8ZW1wdHlfUE9EX1VEVCxub25fZW1wdHkyJj46OnRlc3QoZTEsIG5lMywgZTEsIG5lNCk7CisgICBjb21wcmVzc2VkX3BhaXJfcmVmZXJlbmNlMl90ZXN0ZXI8ZW1wdHlfUE9EX1VEVCxub25fZW1wdHkyJj46OnRlc3QoZTEsIG5lMywgZTEsIG5lNCk7CisgICAvLyBUMSA9PSBUMiwgYm90aCBub24tZW1wdHkKKyAgIGNvbXByZXNzZWRfcGFpcl9yZWZlcmVuY2VfdGVzdGVyPG5vbl9lbXB0eTEmLG5vbl9lbXB0eTEmPjo6dGVzdChuZTEsIG5lMSwgbmUyLCBuZTIpOworCisgICAvLyB0ZXN0cyBhcnJheXM6CisgICBub25fZW1wdHkxIG5lYTFbMl07CisgICBub25fZW1wdHkxIG5lYTJbMl07CisgICBub25fZW1wdHkyIG5lYTNbMl07CisgICBub25fZW1wdHkyIG5lYTRbMl07CisgICBuZWExWzBdID0gbm9uX2VtcHR5MSg1KTsKKyAgIG5lYTJbMF0gPSBub25fZW1wdHkxKDYpOworICAgbmVhM1swXSA9IG5vbl9lbXB0eTIoNyk7CisgICBuZWE0WzBdID0gbm9uX2VtcHR5Mig4KTsKKyAgIAorICAgLy8gVDEgIT0gVDIsIGJvdGggbm9uLWVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfYXJyYXkxX3Rlc3Rlcjxub25fZW1wdHkxWzJdLG5vbl9lbXB0eTI+Ojp0ZXN0KG5lYTEsIG5lMywgbmVhMiwgbmU0KTsKKyAgIGNvbXByZXNzZWRfcGFpcl9hcnJheTJfdGVzdGVyPG5vbl9lbXB0eTEsbm9uX2VtcHR5MlsyXT46OnRlc3QobmUxLCBuZWEzLCBuZTIsIG5lYTQpOworICAgY29tcHJlc3NlZF9wYWlyX2FycmF5X3Rlc3Rlcjxub25fZW1wdHkxWzJdLG5vbl9lbXB0eTJbMl0+Ojp0ZXN0KG5lYTEsIG5lYTMsIG5lYTIsIG5lYTQpOworICAgLy8gVDEgIT0gVDIsIFQyIGVtcHR5CisgICBjb21wcmVzc2VkX3BhaXJfYXJyYXkxX3Rlc3Rlcjxub25fZW1wdHkxWzJdLGVtcHR5X1BPRF9VRFQ+Ojp0ZXN0KG5lYTEsIGUxLCBuZWEyLCBlMSk7CisgICAvLyBUMSAhPSBUMiwgVDEgZW1wdHkKKyAgIGNvbXByZXNzZWRfcGFpcl9hcnJheTJfdGVzdGVyPGVtcHR5X1BPRF9VRFQsbm9uX2VtcHR5MlsyXT46OnRlc3QoZTEsIG5lYTMsIGUxLCBuZWE0KTsKKyAgIC8vIFQxID09IFQyLCBib3RoIG5vbi1lbXB0eQorICAgY29tcHJlc3NlZF9wYWlyX2FycmF5X3Rlc3Rlcjxub25fZW1wdHkxWzJdLG5vbl9lbXB0eTFbMl0+Ojp0ZXN0KG5lYTEsIG5lYTEsIG5lYTIsIG5lYTIpOworICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2luaXRpYWxpemVkX3Rlc3QuY3BwIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg4NTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0LmNwcApAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IDIwMTAsIE5pZWxzIERla2tlci4KKy8vCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLworLy8gVGVzdCBwcm9ncmFtIGZvciBib29zdDo6aW5pdGlhbGl6ZWQ8VD4uCisvLworLy8gMiBNYXkgMjAxMCAoQ3JlYXRlZCkgTmllbHMgRGVra2VyCisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L3ZhbHVlX2luaXQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZQoreworICAvLyBUeXBpY2FsIHVzZSBjYXNlIGZvciBib29zdDo6aW5pdGlhbGl6ZWQ8VD46IEEgZ2VuZXJpYyBjbGFzcyB0aGF0IAorICAvLyBob2xkcyBhIHZhbHVlIG9mIHR5cGUgVCwgd2hpY2ggbXVzdCBiZSBpbml0aWFsaXplZCBieSBlaXRoZXIgCisgIC8vIHZhbHVlLWluaXRpYWxpemF0aW9uIG9yIGRpcmVjdC1pbml0aWFsaXphdGlvbi4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIGtleV92YWx1ZV9wYWlyCisgIHsKKyAgICBzdGQ6OnN0cmluZyBtX2tleTsKKyAgICBib29zdDo6aW5pdGlhbGl6ZWQ8VD4gbV92YWx1ZTsKKyAgcHVibGljOgorIAorICAgIC8vIFZhbHVlLWluaXRpYWxpemVzIHRoZSBvYmplY3QgaGVsZCBieSBtX3ZhbHVlLgorICAgIGtleV92YWx1ZV9wYWlyKCkgeyB9CisKKyAgICAvLyBWYWx1ZS1pbml0aWFsaXplcyB0aGUgb2JqZWN0IGhlbGQgYnkgbV92YWx1ZS4KKyAgICBleHBsaWNpdCBrZXlfdmFsdWVfcGFpcihjb25zdCBzdGQ6OnN0cmluZyYga2V5KQorICAgIDoKKyAgICBtX2tleShrZXkpCisgICAgeworICAgIH0KKworICAgIC8vIERpcmVjdC1pbml0aWFsaXplcyB0aGUgb2JqZWN0IGhlbGQgYnkgbV92YWx1ZS4KKyAgICBrZXlfdmFsdWVfcGFpcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBUJiB2YWx1ZSkKKyAgICA6CisgICAgbV9rZXkoa2V5KSwgbV92YWx1ZSh2YWx1ZSkKKyAgICB7CisgICAgfQorCisgICAgY29uc3QgVCYgZ2V0X3ZhbHVlKCkgY29uc3QKKyAgICB7CisgICAgICByZXR1cm4gbV92YWx1ZTsKKyAgICB9CisgIH07CisKKworICAvLyBUZWxscyB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyB2YWx1ZS1pbml0aWFsaXplZC4KKyAgYm9vbCBpc192YWx1ZV9pbml0aWFsaXplZChjb25zdCBpbnQmIGFyZykKKyAgeworICAgIHJldHVybiBhcmcgPT0gMDsKKyAgfQorCisKKyAgLy8gVGVsbHMgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgdmFsdWUtaW5pdGlhbGl6ZWQuCisgIGJvb2wgaXNfdmFsdWVfaW5pdGlhbGl6ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykKKyAgeworICAgIHJldHVybiBhcmcuZW1wdHkoKTsKKyAgfQorCisgIHN0cnVjdCBmb28KKyAgeworICAgIGludCBkYXRhOworICB9OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmb28mIGxocywgY29uc3QgZm9vJiByaHMpCisgIHsKKyAgICByZXR1cm4gbGhzLmRhdGEgPT0gcmhzLmRhdGE7CisgIH0KKworCisgIC8vIFRlbGxzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIHZhbHVlLWluaXRpYWxpemVkLgorICBib29sIGlzX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IGZvbyYgYXJnKQorICB7CisgICAgcmV0dXJuIGFyZy5kYXRhID09IDA7CisgIH0KKworCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB2b2lkIHRlc3Rfa2V5X3ZhbHVlX3BhaXIoY29uc3QgVCYgbWFnaWNfdmFsdWUpCisgIHsKKyAgICAvLyBUaGUgdmFsdWUgY29tcG9uZW50IG9mIGEgZGVmYXVsdCBrZXlfdmFsdWVfcGFpciBtdXN0IGJlIHZhbHVlLWluaXRpYWxpemVkLgorICAgIGtleV92YWx1ZV9wYWlyPFQ+IGRlZmF1bHRfa2V5X3ZhbHVlX3BhaXI7CisgICAgQk9PU1RfVEVTVCggaXNfdmFsdWVfaW5pdGlhbGl6ZWQoZGVmYXVsdF9rZXlfdmFsdWVfcGFpci5nZXRfdmFsdWUoKSApICk7CisKKyAgICAvLyBUaGUgdmFsdWUgY29tcG9uZW50IG9mIGEga2V5X3ZhbHVlX3BhaXIgdGhhdCBvbmx5IGhhcyBpdHMga2V5IGV4cGxpY2l0bHkgc3BlY2lmaWVkCisgICAgLy8gbXVzdCBhbHNvIGJlIHZhbHVlLWluaXRpYWxpemVkLgorICAgIEJPT1NUX1RFU1QoIGlzX3ZhbHVlX2luaXRpYWxpemVkKGtleV92YWx1ZV9wYWlyPFQ+KCJrZXkiKS5nZXRfdmFsdWUoKSkgKTsKKworICAgIC8vIEhvd2V2ZXIsIHRoZSB2YWx1ZSBjb21wb25lbnQgb2YgdGhlIGZvbGxvd2luZyBrZXlfdmFsdWVfcGFpciBtdXN0IGJlIAorICAgIC8vICJtYWdpY192YWx1ZSIsIGFzIGl0IG11c3QgYmUgZGlyZWN0LWluaXRpYWxpemVkLgorICAgIEJPT1NUX1RFU1QoIGtleV92YWx1ZV9wYWlyPFQ+KCJrZXkiLCBtYWdpY192YWx1ZSkuZ2V0X3ZhbHVlKCkgPT0gbWFnaWNfdmFsdWUgKTsKKyAgfQorfQorCisKKy8vIFRlc3RzIGJvb3N0Ojppbml0aWFsaXplIGZvciBhIGZ1bmRhbWVudGFsIHR5cGUsIGEgdHlwZSB3aXRoIGEKKy8vIHVzZXItZGVmaW5lZCBjb25zdHJ1Y3RvciwgYW5kIGEgdXNlci1kZWZpbmVkIHR5cGUgd2l0aG91dCAKKy8vIGEgdXNlci1kZWZpbmVkIGNvbnN0cnVjdG9yLgoraW50IG1haW4oKQoreworCisgIGNvbnN0IGludCBtYWdpY19udW1iZXIgPSA0MjsKKyAgdGVzdF9rZXlfdmFsdWVfcGFpcihtYWdpY19udW1iZXIpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIG1hZ2ljX3N0cmluZyA9ICJtYWdpYyB2YWx1ZSI7CisgIHRlc3Rfa2V5X3ZhbHVlX3BhaXIobWFnaWNfc3RyaW5nKTsKKworICBjb25zdCBmb28gbWFnaWNfZm9vID0geyA0MiB9OworICB0ZXN0X2tleV92YWx1ZV9wYWlyKG1hZ2ljX2Zvbyk7CisKKyAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2luaXRpYWxpemVkX3Rlc3RfZmFpbDEuY3BwIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0X2ZhaWwxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVlY2FiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0X2ZhaWwxLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxMCwgTmllbHMgRGVra2VyLgorLy8KKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBUZXN0IHByb2dyYW0gZm9yIGJvb3N0Ojppbml0aWFsaXplZDxUPi4gTXVzdCBmYWlsIHRvIGNvbXBpbGUuCisvLworLy8gSW5pdGlhbDogMiBNYXkgMjAxMAorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS92YWx1ZV9pbml0LmhwcD4KKworbmFtZXNwYWNlCit7CisgIHZvaWQgZGlyZWN0X2luaXRpYWxpemVfZnJvbV9pbnQoKQorICB7CisgICAgLy8gT2theTogaW5pdGlhbGl6ZWQ8VD4gc3VwcG9ydHMgZGlyZWN0LWluaXRpYWxpemF0aW9uIGZyb20gVC4KKyAgICBib29zdDo6aW5pdGlhbGl6ZWQ8aW50PiBkaXJlY3RfaW5pdGlhbGl6ZWRfaW50KDEpOworICB9CisKKyAgdm9pZCBjb3B5X2luaXRpYWxpemVfZnJvbV9pbnQoKQorICB7CisgICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBub3QgY29tcGlsZSwgYmVjYXVzZSBpbml0aWFsaXplZDxUPiAKKyAgICAvLyB3YXMgbm90IGludGVuZGVkIHRvIHN1cHBvcnRzIGNvcHktaW5pdGlhbGl6YXRpb24gZnJvbSBULgorICAgIGJvb3N0Ojppbml0aWFsaXplZDxpbnQ+IGNvcHlfaW5pdGlhbGl6ZWRfaW50ID0gMTsKKyAgfQorfQorCitpbnQgbWFpbigpCit7CisgIC8vIFRoaXMgc2hvdWxkIGZhaWwgdG8gY29tcGlsZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGFueSBmdW5jdGlvbi4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2luaXRpYWxpemVkX3Rlc3RfZmFpbDIuY3BwIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0X2ZhaWwyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ZiZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9pbml0aWFsaXplZF90ZXN0X2ZhaWwyLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxMCwgTmllbHMgRGVra2VyLgorLy8KKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBUZXN0IHByb2dyYW0gZm9yIGJvb3N0Ojppbml0aWFsaXplZDxUPi4gTXVzdCBmYWlsIHRvIGNvbXBpbGUuCisvLworLy8gSW5pdGlhbDogMiBNYXkgMjAxMAorCisjaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS92YWx1ZV9pbml0LmhwcD4KKworbmFtZXNwYWNlCit7CisgIHZvaWQgZnJvbV92YWx1ZV9pbml0aWFsaXplZF90b19pbml0aWFsaXplZCgpCisgIHsKKyAgICBib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8aW50PiB2YWx1ZV9pbml0aWFsaXplZF9pbnQ7CisKKyAgICAvLyBPa2F5OiBpbml0aWFsaXplZDxUPiBjYW4gYmUgaW5pdGlhbGl6ZWQgYnkgdmFsdWVfaW5pdGlhbGl6ZWQ8VD4uCisgICAgYm9vc3Q6OmluaXRpYWxpemVkPGludD4gaW5pdGlhbGl6ZWRfaW50KHZhbHVlX2luaXRpYWxpemVkX2ludCk7CisgIH0KKworICB2b2lkIGZyb21faW5pdGlhbGl6ZWRfdG9fdmFsdWVfaW5pdGlhbGl6ZWQoKQorICB7CisgICAgYm9vc3Q6OmluaXRpYWxpemVkPGludD4gaW5pdGlhbGl6ZWRfaW50KDEzKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgbm90IGNvbXBpbGUsIGJlY2F1c2UgaW5pdGlhbGl6ZWQ8VD4KKyAgICAvLyBzaG91bGQgbm90IGJlIGNvbnZlcnRpYmxlIHRvIHZhbHVlX2luaXRpYWxpemVkPFQ+LgorICAgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxpbnQ+IHZhbHVlX2luaXRpYWxpemVkX2ludChpbml0aWFsaXplZF9pbnQpOworICB9Cit9CisKK2ludCBtYWluKCkKK3sKKyAgLy8gVGhpcyBzaG91bGQgZmFpbCB0byBjb21waWxlLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgYW55IGZ1bmN0aW9uLgorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvaXRlcmF0b3JzX3Rlc3QuY3BwIGIvdGVzdC9pdGVyYXRvcnNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZDA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaXRlcmF0b3JzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvLyAgRGVtb25zdHJhdGUgYW5kIHRlc3QgYm9vc3Qvb3BlcmF0b3JzLmhwcCBvbiBzdGQ6Oml0ZXJhdG9ycyAgLS0tLS0tLS0tLS0tLS0vLworCisvLyAgKEMpIENvcHlyaWdodCBKZXJlbXkgU2llayAxOTk5LgorLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisvLyAgU2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnIGZvciBtb3N0IHJlY2VudCB2ZXJzaW9uIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uLgorCisvLyAgUmV2aXNpb24gSGlzdG9yeQorLy8gIDI5IE1heSAwMSBGYWN0b3JlZCBpbXBsZW1lbnRhdGlvbiwgYWRkZWQgY29tcGFyaXNvbiB0ZXN0cywgdXNlIFRlc3QgVG9vbHMKKy8vICAgICAgICAgICAgbGlicmFyeSAoRGFyeWxlIFdhbGtlcikKKy8vICAxMiBEZWMgOTkgSW5pdGlhbCB2ZXJzaW9uIHdpdGggaXRlcmF0b3Igb3BlcmF0b3JzIChKZXJlbXkgU2llaykKKworI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPiAgICAgLy8gZm9yIEJPT1NUX1NUQVRJQ19DT05TVEFOVAorI2luY2x1ZGUgPGJvb3N0L29wZXJhdG9ycy5ocHA+ICAvLyBmb3IgYm9vc3Q6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfaGVscGVyCisKKyNpbmNsdWRlIDxjc3RkZGVmPiAgICAvLyBmb3Igc3RkOjpwdHJkaWZmX3QsIHN0ZDo6c2l6ZV90CisjaW5jbHVkZSA8Y3N0cmluZz4gICAgLy8gZm9yIHN0ZDo6c3RyY21wCisjaW5jbHVkZSA8aW9zdHJlYW0+ICAgLy8gZm9yIHN0ZDo6Y291dCAoc3RkOjplbmRsLCBlbmRzLCBhbmQgZmx1c2ggaW5kaXJlY3RseSkKKyNpbmNsdWRlIDxzdHJpbmc+ICAgICAvLyBmb3Igc3RkOjpzdHJpbmcKKyNpbmNsdWRlIDxzc3RyZWFtPiAgICAvLyBmb3Igc3RkOjpzdHJpbmdzdHJlYW0KKworIyBpZmRlZiBCT09TVF9OT19TVERDX05BTUVTUEFDRQorICAgIG5hbWVzcGFjZSBzdGQgeyB1c2luZyA6OnN0cmNtcDsgfQorIyBlbmRpZgorCisKKy8vIEl0ZXJhdG9yIHRlc3QgY2xhc3MKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBSLCBjbGFzcyBQPgorc3RydWN0IHRlc3RfaXRlcgorICA6IHB1YmxpYyBib29zdDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl9oZWxwZXI8CisgICAgIHRlc3RfaXRlcjxULFIsUD4sIFQsIHN0ZDo6cHRyZGlmZl90LCBQLCBSPgoreworICB0eXBlZGVmIHRlc3RfaXRlciBzZWxmOworICB0eXBlZGVmIFIgUmVmZXJlbmNlOworICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IERpc3RhbmNlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IHRlc3RfaXRlcihUKiBpID0wKSA6IF9pKGkpIHsgfQorICB0ZXN0X2l0ZXIoY29uc3Qgc2VsZiYgeCkgOiBfaSh4Ll9pKSB7IH0KKyAgc2VsZiYgb3BlcmF0b3I9KGNvbnN0IHNlbGYmIHgpIHsgX2kgPSB4Ll9pOyByZXR1cm4gKnRoaXM7IH0KKyAgUmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpfaTsgfQorICBzZWxmJiBvcGVyYXRvcisrKCkgeyArK19pOyByZXR1cm4gKnRoaXM7IH0KKyAgc2VsZiYgb3BlcmF0b3ItLSgpIHsgLS1faTsgcmV0dXJuICp0aGlzOyB9CisgIHNlbGYmIG9wZXJhdG9yKz0oRGlzdGFuY2UgbikgeyBfaSArPSBuOyByZXR1cm4gKnRoaXM7IH0KKyAgc2VsZiYgb3BlcmF0b3ItPShEaXN0YW5jZSBuKSB7IF9pIC09IG47IHJldHVybiAqdGhpczsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2VsZiYgeCkgY29uc3QgeyByZXR1cm4gX2kgPT0geC5faTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBzZWxmJiB4KSBjb25zdCB7IHJldHVybiBfaSA8IHguX2k7IH0KKyAgZnJpZW5kIERpc3RhbmNlIG9wZXJhdG9yLShjb25zdCBzZWxmJiB4LCBjb25zdCBzZWxmJiB5KSB7CisgICAgcmV0dXJuIHguX2kgLSB5Ll9pOyAKKyAgfQorcHJvdGVjdGVkOgorICBQIF9pOworfTsKKworLy8gSXRlcmF0b3Igb3BlcmF0b3IgdGVzdGluZyBjbGFzc2VzCitjbGFzcyB0ZXN0X29wcl9iYXNlCit7Citwcm90ZWN0ZWQ6CisgICAgLy8gVGVzdCBkYXRhIGFuZCB0eXBlcworICAgIEJPT1NUX1NUQVRJQ19DT05TVEFOVCggc3RkOjpzaXplX3QsIGZydWl0X2xlbmd0aCA9IDZ1ICk7CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nICBmcnVpdF9hcnJheV90eXBlWyBmcnVpdF9sZW5ndGggXTsKKworICAgIHN0YXRpYyAgZnJ1aXRfYXJyYXlfdHlwZSAgICBmcnVpdDsKKworfTsgIC8vIHRlc3Rfb3ByX2Jhc2UKKworI2lmbmRlZiBCT09TVF9OT19JTkNMQVNTX01FTUJFUl9JTklUSUFMSVpBVElPTgorLy8gIEEgZGVmaW5pdGlvbiBpcyByZXF1aXJlZCBldmVuIGZvciBpbnRlZ3JhbCBzdGF0aWMgY29uc3RhbnRzCitjb25zdCBzdGQ6OnNpemVfdCB0ZXN0X29wcl9iYXNlOjpmcnVpdF9sZW5ndGg7CisjZW5kaWYKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIgPSBUJiwgdHlwZW5hbWUgUCA9IFQqPgorY2xhc3MgdGVzdF9vcHIKKyAgICA6IHB1YmxpYyB0ZXN0X29wcl9iYXNlCit7CisgICAgdHlwZWRlZiB0ZXN0X29wcjxULCBSLCBQPiAgc2VsZl90eXBlOworCitwdWJsaWM6CisgICAgLy8gVHlwZXMKKyAgICB0eXBlZGVmIFQgIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBSICByZWZlcmVuY2U7CisgICAgdHlwZWRlZiBQICBwb2ludGVyOworCisgICAgdHlwZWRlZiB0ZXN0X2l0ZXI8VCwgUiwgUD4gIGl0ZXJfdHlwZTsKKworICAgIC8vIFRlc3QgY29udHJvbGxlcgorICAgIHN0YXRpYyAgdm9pZCAgbWFzdGVyX3Rlc3QoIGNoYXIgY29uc3QgbmFtZVtdICk7CisKK3ByaXZhdGU6CisgICAgLy8gVGVzdCBkYXRhCisgICAgc3RhdGljIGl0ZXJfdHlwZSBjb25zdCAgZnJ1aXRfYmVnaW47CisgICAgc3RhdGljIGl0ZXJfdHlwZSBjb25zdCAgZnJ1aXRfZW5kOworCisgICAgLy8gVGVzdCBwYXJ0cworICAgIHN0YXRpYyAgdm9pZCAgcG9zdF9pbmNyZW1lbnRfdGVzdCgpOworICAgIHN0YXRpYyAgdm9pZCAgcG9zdF9kZWNyZW1lbnRfdGVzdCgpOworICAgIHN0YXRpYyAgdm9pZCAgaW5kaXJlY3RfcmVmZXJyYWxfdGVzdCgpOworICAgIHN0YXRpYyAgdm9pZCAgb2Zmc2V0X2FkZGl0aW9uX3Rlc3QoKTsKKyAgICBzdGF0aWMgIHZvaWQgIHJldmVyc2Vfb2Zmc2V0X2FkZGl0aW9uX3Rlc3QoKTsKKyAgICBzdGF0aWMgIHZvaWQgIG9mZnNldF9zdWJ0cmFjdGlvbl90ZXN0KCk7CisgICAgc3RhdGljICB2b2lkICBjb21wYXJpc29uX3Rlc3QoKTsKKyAgICBzdGF0aWMgIHZvaWQgIGluZGV4aW5nX3Rlc3QoKTsKKworfTsgIC8vIHRlc3Rfb3ByCisKKworLy8gQ2xhc3Mtc3RhdGljIGRhdGEgZGVmaW5pdGlvbnMKK3Rlc3Rfb3ByX2Jhc2U6OmZydWl0X2FycmF5X3R5cGUKKyB0ZXN0X29wcl9iYXNlOjpmcnVpdCA9IHsgImFwcGxlIiwgIm9yYW5nZSIsICJwZWFyIiwgInBlYWNoIiwgImdyYXBlIiwgInBsdW0iIH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgorICB0eXBlbmFtZSB0ZXN0X29wcjxULCBSLCBQPjo6aXRlcl90eXBlIGNvbnN0CisgdGVzdF9vcHI8VCwgUiwgUD46OmZydWl0X2JlZ2luID0gdGVzdF9pdGVyPFQsUixQPiggZnJ1aXQgKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIFA+Cit0eXBlbmFtZSB0ZXN0X29wcjxULCBSLCBQPjo6aXRlcl90eXBlIGNvbnN0CisgdGVzdF9vcHI8VCwgUiwgUD46OmZydWl0X2VuZCA9IHRlc3RfaXRlcjxULFIsUD4oIGZydWl0ICsgZnJ1aXRfbGVuZ3RoICk7CisKKworLy8gTWFpbiB0ZXN0aW5nIGZ1bmN0aW9uCitpbnQKK21haW4oKQoreworICAgIHVzaW5nIHN0ZDo6c3RyaW5nOworCisgICAgdHlwZWRlZiB0ZXN0X29wcjxzdHJpbmcsIHN0cmluZyAmLCBzdHJpbmcgKj4gICAgICAgICAgICAgIHRlc3QxX3R5cGU7CisgICAgdHlwZWRlZiB0ZXN0X29wcjxzdHJpbmcsIHN0cmluZyBjb25zdCAmLCBzdHJpbmcgY29uc3QgKj4gIHRlc3QyX3R5cGU7CisKKyAgICB0ZXN0MV90eXBlOjptYXN0ZXJfdGVzdCggIm5vbi1jb25zdCBzdHJpbmciICk7CisgICAgdGVzdDJfdHlwZTo6bWFzdGVyX3Rlc3QoICJjb25zdCBzdHJpbmciICk7CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KKworLy8gVGVzdHMgZm9yIGFsbCBvZiB0aGUgb3BlcmF0b3JzIGFkZGVkIGJ5IHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfaGVscGVyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgUD4KK3ZvaWQKK3Rlc3Rfb3ByPFQsIFIsIFA+OjptYXN0ZXJfdGVzdAorKAorICAgIGNoYXIgY29uc3QgIG5hbWVbXQorKQoreworICAgIHN0ZDo6Y291dCA8PCAiRG9pbmcgdGVzdCBydW4gZm9yICIgPDwgbmFtZSA8PCAnLicgPDwgc3RkOjplbmRsOworCisgICAgcG9zdF9pbmNyZW1lbnRfdGVzdCgpOworICAgIHBvc3RfZGVjcmVtZW50X3Rlc3QoKTsKKyAgICBpbmRpcmVjdF9yZWZlcnJhbF90ZXN0KCk7CisgICAgb2Zmc2V0X2FkZGl0aW9uX3Rlc3QoKTsKKyAgICByZXZlcnNlX29mZnNldF9hZGRpdGlvbl90ZXN0KCk7CisgICAgb2Zmc2V0X3N1YnRyYWN0aW9uX3Rlc3QoKTsKKyAgICBjb21wYXJpc29uX3Rlc3QoKTsKKyAgICBpbmRleGluZ190ZXN0KCk7Cit9CisKKy8vIFRlc3QgcG9zdC1pbmNyZW1lbnQKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgordm9pZAordGVzdF9vcHI8VCwgUiwgUD46OnBvc3RfaW5jcmVtZW50X3Rlc3QKKygKKykKK3sKKyAgICBzdGQ6OmNvdXQgPDwgIlx0RG9pbmcgcG9zdC1pbmNyZW1lbnQgdGVzdC4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zczsKKyAgICBmb3IgKCBpdGVyX3R5cGUgaSA9IGZydWl0X2JlZ2luIDsgaSAhPSBmcnVpdF9lbmQgOyApCisgICAgeworICAgICAgICBvc3MgPDwgKmkrKyA8PCAnICc7CisgICAgfQorCisgICAgQk9PU1RfVEVTVCggb3NzLnN0cigpID09ICJhcHBsZSBvcmFuZ2UgcGVhciBwZWFjaCBncmFwZSBwbHVtICIpOworfQorCisvLyBUZXN0IHBvc3QtZGVjcmVtZW50Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgUD4KK3ZvaWQKK3Rlc3Rfb3ByPFQsIFIsIFA+Ojpwb3N0X2RlY3JlbWVudF90ZXN0CisoCispCit7CisgICAgc3RkOjpjb3V0IDw8ICJcdERvaW5nIHBvc3QtZGVjcmVtZW50IHRlc3QuIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvc3M7CisgICAgZm9yICggaXRlcl90eXBlIGkgPSBmcnVpdF9lbmQgOyBpICE9IGZydWl0X2JlZ2luIDsgKQorICAgIHsKKyAgICAgICAgaS0tOworICAgICAgICBvc3MgPDwgKmkgPDwgJyAnOworICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9zcy5zdHIoKSA9PSAicGx1bSBncmFwZSBwZWFjaCBwZWFyIG9yYW5nZSBhcHBsZSAiKTsKK30KKworLy8gVGVzdCBpbmRpcmVjdCBzdHJ1Y3R1cmUgcmVmZXJyYWwKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgordm9pZAordGVzdF9vcHI8VCwgUiwgUD46OmluZGlyZWN0X3JlZmVycmFsX3Rlc3QKKygKKykKK3sKKyAgICBzdGQ6OmNvdXQgPDwgIlx0RG9pbmcgaW5kaXJlY3QgcmVmZXJlbmNlIHRlc3QuIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvc3M7CisgICAgZm9yICggaXRlcl90eXBlIGkgPSBmcnVpdF9iZWdpbiA7IGkgIT0gZnJ1aXRfZW5kIDsgKytpICkKKyAgICB7CisgICAgICAgIG9zcyA8PCBpLT5zaXplKCkgPDwgJyAnOworICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9zcy5zdHIoKSA9PSAiNSA2IDQgNSA1IDQgIik7Cit9CisKKy8vIFRlc3Qgb2Zmc2V0IGFkZGl0aW9uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiwgdHlwZW5hbWUgUD4KK3ZvaWQKK3Rlc3Rfb3ByPFQsIFIsIFA+OjpvZmZzZXRfYWRkaXRpb25fdGVzdAorKAorKQoreworICAgIHN0ZDo6Y291dCA8PCAiXHREb2luZyBvZmZzZXQgYWRkaXRpb24gdGVzdC4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6cHRyZGlmZl90IGNvbnN0ICB0d28gPSAyOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zczsKKyAgICBmb3IgKCBpdGVyX3R5cGUgaSA9IGZydWl0X2JlZ2luIDsgaSAhPSBmcnVpdF9lbmQgOyBpID0gaSArIHR3byApCisgICAgeworICAgICAgICBvc3MgPDwgKmkgPDwgJyAnOworICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9zcy5zdHIoKSA9PSAiYXBwbGUgcGVhciBncmFwZSAiKTsKK30KKworLy8gVGVzdCBvZmZzZXQgYWRkaXRpb24sIGluIHJldmVyc2Ugb3JkZXIKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgordm9pZAordGVzdF9vcHI8VCwgUiwgUD46OnJldmVyc2Vfb2Zmc2V0X2FkZGl0aW9uX3Rlc3QKKygKKykKK3sKKyAgICBzdGQ6OmNvdXQgPDwgIlx0RG9pbmcgcmV2ZXJzZSBvZmZzZXQgYWRkaXRpb24gdGVzdC4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6cHRyZGlmZl90IGNvbnN0ICB0d28gPSAyOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zczsKKyAgICBmb3IgKCBpdGVyX3R5cGUgaSA9IGZydWl0X2JlZ2luIDsgaSAhPSBmcnVpdF9lbmQgOyBpID0gdHdvICsgaSApCisgICAgeworICAgICAgICBvc3MgPDwgKmkgPDwgJyAnOworICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9zcy5zdHIoKSA9PSAiYXBwbGUgcGVhciBncmFwZSAiKTsKK30KKworLy8gVGVzdCBvZmZzZXQgc3VidHJhY3Rpb24KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgordm9pZAordGVzdF9vcHI8VCwgUiwgUD46Om9mZnNldF9zdWJ0cmFjdGlvbl90ZXN0CisoCispCit7CisgICAgc3RkOjpjb3V0IDw8ICJcdERvaW5nIG9mZnNldCBzdWJ0cmFjdGlvbiB0ZXN0LiIgPDwgc3RkOjplbmRsOworCisgICAgc3RkOjpwdHJkaWZmX3QgY29uc3QgIHR3byA9IDI7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gb3NzOworICAgIGZvciAoIGl0ZXJfdHlwZSBpID0gZnJ1aXRfZW5kIDsgZnJ1aXRfYmVnaW4gPCBpIDsgKQorICAgIHsKKyAgICAgICAgaSA9IGkgLSB0d287CisgICAgICAgIGlmICggKGZydWl0X2JlZ2luIDwgaSkgfHwgKGZydWl0X2JlZ2luID09IGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgb3NzIDw8ICppIDw8ICcgJzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJPT1NUX1RFU1QoIG9zcy5zdHIoKSA9PSAiZ3JhcGUgcGVhciBhcHBsZSAiKTsKK30KKworLy8gVGVzdCBjb21wYXJpc29ucwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIFA+Cit2b2lkCit0ZXN0X29wcjxULCBSLCBQPjo6Y29tcGFyaXNvbl90ZXN0CisoCispCit7CisgICAgdXNpbmcgc3RkOjpjb3V0OworICAgIHVzaW5nIHN0ZDo6cHRyZGlmZl90OworCisgICAgY291dCA8PCAiXHREb2luZyBjb21wYXJpc29uIHRlc3RzLlxuXHRcdFBhc3M6IjsKKworICAgIGZvciAoIGl0ZXJfdHlwZSBpID0gZnJ1aXRfYmVnaW4gOyBpICE9IGZydWl0X2VuZCA7ICsraSApCisgICAgeworICAgICAgICBwdHJkaWZmX3QgY29uc3QgIGlfb2Zmc2V0ID0gaSAtIGZydWl0X2JlZ2luOworCisgICAgICAgIGNvdXQgPDwgJyAnIDw8ICppIDw8IHN0ZDo6Zmx1c2g7CisgICAgICAgIGZvciAoIGl0ZXJfdHlwZSBqID0gZnJ1aXRfYmVnaW4gOyBqICE9IGZydWl0X2VuZCA7ICsraiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cmRpZmZfdCBjb25zdCAgal9vZmZzZXQgPSBqIC0gZnJ1aXRfYmVnaW47CisKKyAgICAgICAgICAgIEJPT1NUX1RFU1QoIChpICE9IGopID09IChpX29mZnNldCAhPSBqX29mZnNldCkgKTsKKyAgICAgICAgICAgIEJPT1NUX1RFU1QoIChpID4gaikgPT0gKGlfb2Zmc2V0ID4gal9vZmZzZXQpICk7CisgICAgICAgICAgICBCT09TVF9URVNUKCAoaSA8PSBqKSA9PSAoaV9vZmZzZXQgPD0gal9vZmZzZXQpICk7CisgICAgICAgICAgICBCT09TVF9URVNUKCAoaSA+PSBqKSA9PSAoaV9vZmZzZXQgPj0gal9vZmZzZXQpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgY291dCA8PCBzdGQ6OmVuZGw7Cit9CisKKy8vIFRlc3QgaW5kZXhpbmcKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSLCB0eXBlbmFtZSBQPgordm9pZAordGVzdF9vcHI8VCwgUiwgUD46OmluZGV4aW5nX3Rlc3QKKygKKykKK3sKKyAgICBzdGQ6OmNvdXQgPDwgIlx0RG9pbmcgaW5kZXhpbmcgdGVzdC4iIDw8IHN0ZDo6ZW5kbDsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zczsKKyAgICBmb3IgKCBzdGQ6OnNpemVfdCBrID0gMHUgOyBrIDwgZnJ1aXRfbGVuZ3RoIDsgKytrICkKKyAgICB7CisgICAgICAgIG9zcyA8PCBmcnVpdF9iZWdpblsgayBdIDw8ICcgJzsKKyAgICB9CisKKyAgICBCT09TVF9URVNUKCBvc3Muc3RyKCkgPT0gImFwcGxlIG9yYW5nZSBwZWFyIHBlYWNoIGdyYXBlIHBsdW0gIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0L29wZXJhdG9yc190ZXN0LmNwcCBiL3Rlc3Qvb3BlcmF0b3JzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjdhNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L29wZXJhdG9yc190ZXN0LmNwcApAQCAtMCwwICsxLDkzNiBAQAorLy8gIERlbW9uc3RyYXRlIGFuZCB0ZXN0IGJvb3N0L29wZXJhdG9ycy5ocHAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworCisvLyAgQ29weXJpZ2h0IEJlbWFuIERhd2VzIDE5OTkuICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QKKy8vICBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZQorLy8gIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3V0aWxpdHkgZm9yIGRvY3VtZW50YXRpb24uCisKKy8vICBSZXZpc2lvbiBIaXN0b3J5CisvLyAgMDMgQXByIDA4IEFkZGVkIGNvbnZlcnRpYmxlX3RvX2Jvb2wgKERhbmllbCBGcmV5KQorLy8gIDAxIE9jdCAwMSBBZGRlZCB0ZXN0cyBmb3IgImxlZnQiIG9wZXJhdG9ycworLy8gICAgICAgICAgICBhbmQgbmV3IGdyb3VwZWQgb3BlcmF0b3JzLiAoSGVsbXV0IFplaXNlbCkKKy8vICAyMCBNYXkgMDEgT3V0cHV0IHByb2dyZXNzIG1lc3NhZ2VzLiAgQWRkZWQgdGVzdHMgZm9yIG5ldyBvcGVyYXRvcgorLy8gICAgICAgICAgICB0ZW1wbGF0ZXMuICBVcGRhdGVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiAgQ2hhbmdlZCB0ZXN0cyB0bworLy8gICAgICAgICAgICB1c2UgQm9vc3QgVGVzdCBUb29scyBsaWJyYXJ5LiAgKERhcnlsZSBXYWxrZXIpCisvLyAgMDQgSnVuIDAwIEFkZGVkIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBidWcgSSBmb3VuZCAoRGF2aWQgQWJyYWhhbXMpCisvLyAgMTcgSnVuIDAwIEZpeCBmb3IgYnJva2VuIGNvbXBpbGVycyAoQWxla3NleSBHdXJ0b3ZveSkKKy8vICA/PyA/Pz8gMDAgTWFqb3IgdXBkYXRlIHRvIHJhbmRvbWx5IHRlc3QgYWxsIG9uZS0gYW5kIHR3by0gYXJndW1lbnQgZm9ybXMgYnkKKy8vICAgICAgICAgICAgd3JhcHBpbmcgaW50ZWdyYWwgdHlwZXMgYW5kIGNvbXBhcmluZyB0aGUgcmVzdWx0cyBvZiBvcGVyYXRpb25zCisvLyAgICAgICAgICAgIHRvIHRoZSByZXN1bHRzIGZvciB0aGUgcmF3IHR5cGVzIChEYXZpZCBBYnJhaGFtcykKKy8vICAxMiBEZWMgOTkgTWlub3IgdXBkYXRlLCBvdXRwdXQgY29uZmlybWF0aW9uIG1lc3NhZ2UuCisvLyAgMTUgTm92IDk5IEluaXRpYWwgdmVyc2lvbgorCisjaW5jbHVkZSA8Ym9vc3QvY29uZmlnLmhwcD4gICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIEJPT1NUX01TVkMKKyNpbmNsdWRlIDxib29zdC9vcGVyYXRvcnMuaHBwPiAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHRlc3RlZCBpdGVtcworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZGV0YWlsL21pbnN0ZF9yYW5kLmhwcD4gIC8vIGZvciBib29zdDo6ZGV0YWlsOjptaW5zdGRfcmFuZAorI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIGZvciBzdGQ6OmNvdXQgKHN0ZDo6ZW5kbCBpbmRpcmVjdGx5KQorCisKK25hbWVzcGFjZQoreworICAgIC8vIGF2b2lkaW5nIGEgdGVtcGxhdGUgdmVyc2lvbiBvZiB0cnVlX3ZhbHVlIHNvIGFzIHRvIG5vdCBjb25mdXNlIFZDKysKKyAgICBpbnQgdHJ1ZV92YWx1ZShpbnQgeCkgeyByZXR1cm4geDsgfQorICAgIGxvbmcgdHJ1ZV92YWx1ZShsb25nIHgpIHsgcmV0dXJuIHg7IH0KKyAgICBzaWduZWQgY2hhciB0cnVlX3ZhbHVlKHNpZ25lZCBjaGFyIHgpIHsgcmV0dXJuIHg7IH0KKyAgICB1bnNpZ25lZCBpbnQgdHJ1ZV92YWx1ZSh1bnNpZ25lZCBpbnQgeCkgeyByZXR1cm4geDsgfQorICAgIHVuc2lnbmVkIGxvbmcgdHJ1ZV92YWx1ZSh1bnNpZ25lZCBsb25nIHgpIHsgcmV0dXJuIHg7IH0KKyAgICB1bnNpZ25lZCBjaGFyIHRydWVfdmFsdWUodW5zaWduZWQgY2hhciB4KSB7IHJldHVybiB4OyB9CisKKyAgICAvLyB2ZXJpZnkgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciBzb21lIG9wZXJhdG9ycworICAgIGNsYXNzIGNvbnZlcnRpYmxlX3RvX2Jvb2wKKyAgICB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBfdmFsdWU7CisKKyAgICAgICAgdHlwZWRlZiBib29sIGNvbnZlcnRpYmxlX3RvX2Jvb2w6Oip1bnNwZWNpZmllZF9ib29sX3R5cGU7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvciEoKSBjb25zdDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCggY29uc3QgYm9vbCB2YWx1ZSApIDogX3ZhbHVlKCB2YWx1ZSApIHt9CisKKyAgICAgICAgb3BlcmF0b3IgdW5zcGVjaWZpZWRfYm9vbF90eXBlKCkgY29uc3QKKyAgICAgICAgICB7IHJldHVybiBfdmFsdWUgPyAmY29udmVydGlibGVfdG9fYm9vbDo6X3ZhbHVlIDogMDsgfQorICAgIH07CisKKyAgICAvLyBUaGUgdXNlIG9mIG9wZXJhdG9yczw+IGhlcmUgdGVuZGVkIHRvIG9ic2N1cmUKKyAgICAvLyBpbnRlcmFjdGlvbnMgd2l0aCBjZXJ0YWluIGNvbXBpbGVyIGJ1Z3MKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBjbGFzcyBXcmFwcGVkMQorICAgICAgICA6IGJvb3N0OjpvcGVyYXRvcnM8V3JhcHBlZDE8VD4gPgorICAgICAgICAsIGJvb3N0OjpzaGlmdGFibGU8V3JhcHBlZDE8VD4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFdyYXBwZWQxKCBUIHYgPSBUKCkgKSA6IF92YWx1ZSh2KSB7fQorICAgICAgICBUIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcjwoY29uc3QgV3JhcHBlZDEmIHgpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlIDwgeC5fdmFsdWU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdyYXBwZWQxJiB4KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSB4Ll92YWx1ZTsgfQorICAgICAgICAKKyAgICAgICAgV3JhcHBlZDEmIG9wZXJhdG9yKz0oY29uc3QgV3JhcHBlZDEmIHgpCisgICAgICAgICAgeyBfdmFsdWUgKz0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMSYgb3BlcmF0b3ItPShjb25zdCBXcmFwcGVkMSYgeCkKKyAgICAgICAgICB7IF92YWx1ZSAtPSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQxJiBvcGVyYXRvcio9KGNvbnN0IFdyYXBwZWQxJiB4KQorICAgICAgICAgIHsgX3ZhbHVlICo9IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDEmIG9wZXJhdG9yLz0oY29uc3QgV3JhcHBlZDEmIHgpCisgICAgICAgICAgeyBfdmFsdWUgLz0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMSYgb3BlcmF0b3IlPShjb25zdCBXcmFwcGVkMSYgeCkKKyAgICAgICAgICB7IF92YWx1ZSAlPSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQxJiBvcGVyYXRvcnw9KGNvbnN0IFdyYXBwZWQxJiB4KQorICAgICAgICAgIHsgX3ZhbHVlIHw9IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDEmIG9wZXJhdG9yJj0oY29uc3QgV3JhcHBlZDEmIHgpCisgICAgICAgICAgeyBfdmFsdWUgJj0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMSYgb3BlcmF0b3JePShjb25zdCBXcmFwcGVkMSYgeCkKKyAgICAgICAgICB7IF92YWx1ZSBePSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQxJiBvcGVyYXRvcjw8PShjb25zdCBXcmFwcGVkMSYgeCkKKyAgICAgICAgICB7IF92YWx1ZSA8PD0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMSYgb3BlcmF0b3I+Pj0oY29uc3QgV3JhcHBlZDEmIHgpCisgICAgICAgICAgeyBfdmFsdWUgPj49IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDEmIG9wZXJhdG9yKysoKSAgICAgICAgICAgICAgIHsgKytfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMSYgb3BlcmF0b3ItLSgpICAgICAgICAgICAgICAgeyAtLV92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFQgX3ZhbHVlOworICAgIH07CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCB0cnVlX3ZhbHVlKFdyYXBwZWQxPFQ+IHgpIHsgcmV0dXJuIHgudmFsdWUoKTsgfSAgICAKKworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICAgIGNsYXNzIFdyYXBwZWQyCisgICAgICAgIDogYm9vc3Q6Om9wZXJhdG9yczxXcmFwcGVkMjxULCBVPiA+CisgICAgICAgICwgYm9vc3Q6Om9wZXJhdG9yczI8V3JhcHBlZDI8VCwgVT4sIFU+CisgICAgICAgICwgYm9vc3Q6OnNoaWZ0YWJsZTE8V3JhcHBlZDI8VCwgVT4KKyAgICAgICAgLCBib29zdDo6c2hpZnRhYmxlMjxXcmFwcGVkMjxULCBVPiwgVSA+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBXcmFwcGVkMiggVCB2ID0gVCgpICkgOiBfdmFsdWUodikge30KKyAgICAgICAgVCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgICAgIGNvbnZlcnRpYmxlX3RvX2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFdyYXBwZWQyJiB4KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA8IHguX3ZhbHVlOyB9CisgICAgICAgIGNvbnZlcnRpYmxlX3RvX2Jvb2wgb3BlcmF0b3I9PShjb25zdCBXcmFwcGVkMiYgeCkgY29uc3QKKyAgICAgICAgICB7IHJldHVybiBfdmFsdWUgPT0geC5fdmFsdWU7IH0KKyAgICAgICAgCisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcis9KGNvbnN0IFdyYXBwZWQyJiB4KQorICAgICAgICAgIHsgX3ZhbHVlICs9IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDImIG9wZXJhdG9yLT0oY29uc3QgV3JhcHBlZDImIHgpCisgICAgICAgICAgeyBfdmFsdWUgLT0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMiYgb3BlcmF0b3IqPShjb25zdCBXcmFwcGVkMiYgeCkKKyAgICAgICAgICB7IF92YWx1ZSAqPSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvci89KGNvbnN0IFdyYXBwZWQyJiB4KQorICAgICAgICAgIHsgX3ZhbHVlIC89IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDImIG9wZXJhdG9yJT0oY29uc3QgV3JhcHBlZDImIHgpCisgICAgICAgICAgeyBfdmFsdWUgJT0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMiYgb3BlcmF0b3J8PShjb25zdCBXcmFwcGVkMiYgeCkKKyAgICAgICAgICB7IF92YWx1ZSB8PSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvciY9KGNvbnN0IFdyYXBwZWQyJiB4KQorICAgICAgICAgIHsgX3ZhbHVlICY9IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDImIG9wZXJhdG9yXj0oY29uc3QgV3JhcHBlZDImIHgpCisgICAgICAgICAgeyBfdmFsdWUgXj0geC5fdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBXcmFwcGVkMiYgb3BlcmF0b3I8PD0oY29uc3QgV3JhcHBlZDImIHgpCisgICAgICAgICAgeyBfdmFsdWUgPDw9IHguX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDImIG9wZXJhdG9yPj49KGNvbnN0IFdyYXBwZWQyJiB4KQorICAgICAgICAgIHsgX3ZhbHVlID4+PSB4Ll92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcisrKCkgICAgICAgICAgICAgICAgeyArK192YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvci0tKCkgICAgICAgICAgICAgICAgeyAtLV92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgICAKKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcjwoVSB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA8IHU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcj4oVSB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA+IHU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcj09KFUgdSkgY29uc3QKKyAgICAgICAgICB7IHJldHVybiBfdmFsdWUgPT0gdTsgfQorCisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcis9KFUgdSkgeyBfdmFsdWUgKz0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvci09KFUgdSkgeyBfdmFsdWUgLT0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcio9KFUgdSkgeyBfdmFsdWUgKj0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvci89KFUgdSkgeyBfdmFsdWUgLz0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvciU9KFUgdSkgeyBfdmFsdWUgJT0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcnw9KFUgdSkgeyBfdmFsdWUgfD0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvciY9KFUgdSkgeyBfdmFsdWUgJj0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcl49KFUgdSkgeyBfdmFsdWUgXj0gdTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFdyYXBwZWQyJiBvcGVyYXRvcjw8PShVIHUpIHsgX3ZhbHVlIDw8PSB1OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgV3JhcHBlZDImIG9wZXJhdG9yPj49KFUgdSkgeyBfdmFsdWUgPj49IHU7IHJldHVybiAqdGhpczsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCBfdmFsdWU7CisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBUIHRydWVfdmFsdWUoV3JhcHBlZDI8VCxVPiB4KSB7IHJldHVybiB4LnZhbHVlKCk7IH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBjbGFzcyBXcmFwcGVkMworICAgICAgICA6IGJvb3N0OjplcXVpdmFsZW50PFdyYXBwZWQzPFQ+ID4KKyAgICAgICAgLCBib29zdDo6cGFydGlhbGx5X29yZGVyZWQ8V3JhcHBlZDM8VD4gPgorICAgICAgICAsIGJvb3N0OjplcXVhbGl0eV9jb21wYXJhYmxlPFdyYXBwZWQzPFQ+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBXcmFwcGVkMyggVCB2ID0gVCgpICkgOiBfdmFsdWUodikge30KKyAgICAgICAgVCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIF92YWx1ZTsgfQorCisgICAgICAgIGNvbnZlcnRpYmxlX3RvX2Jvb2wgb3BlcmF0b3I8KGNvbnN0IFdyYXBwZWQzJiB4KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA8IHguX3ZhbHVlOyB9CisgICAgICAgIAorICAgIHByaXZhdGU6CisgICAgICAgIFQgX3ZhbHVlOworICAgIH07CisgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgVCB0cnVlX3ZhbHVlKFdyYXBwZWQzPFQ+IHgpIHsgcmV0dXJuIHgudmFsdWUoKTsgfSAgICAKKworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICAgIGNsYXNzIFdyYXBwZWQ0CisgICAgICAgIDogYm9vc3Q6OmVxdWFsaXR5X2NvbXBhcmFibGUxPFdyYXBwZWQ0PFQsIFU+CisgICAgICAgICwgYm9vc3Q6OmVxdWl2YWxlbnQxPFdyYXBwZWQ0PFQsIFU+CisgICAgICAgICwgYm9vc3Q6OnBhcnRpYWxseV9vcmRlcmVkMTxXcmFwcGVkNDxULCBVPiA+ID4gPgorICAgICAgICAsIGJvb3N0OjpwYXJ0aWFsbHlfb3JkZXJlZDI8V3JhcHBlZDQ8VCwgVT4sIFUKKyAgICAgICAgLCBib29zdDo6ZXF1aXZhbGVudDI8V3JhcHBlZDQ8VCwgVT4sIFUKKyAgICAgICAgLCBib29zdDo6ZXF1YWxpdHlfY29tcGFyYWJsZTI8V3JhcHBlZDQ8VCwgVT4sIFU+ID4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFdyYXBwZWQ0KCBUIHYgPSBUKCkgKSA6IF92YWx1ZSh2KSB7fQorICAgICAgICBUIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcjwoY29uc3QgV3JhcHBlZDQmIHgpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlIDwgeC5fdmFsdWU7IH0KKyAgICAgICAgIAorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPChVIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlIDwgdTsgfQorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPihVIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlID4gdTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCBfdmFsdWU7CisgICAgfTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KKyAgICBUIHRydWVfdmFsdWUoV3JhcHBlZDQ8VCxVPiB4KSB7IHJldHVybiB4LnZhbHVlKCk7IH0KKyAgICAKKyAgICAvLyBVIG11c3QgYmUgY29udmVydGlibGUgdG8gVAorICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICAgIGNsYXNzIFdyYXBwZWQ1CisgICAgICAgIDogYm9vc3Q6Om9yZGVyZWRfZmllbGRfb3BlcmF0b3JzMjxXcmFwcGVkNTxULCBVPiwgVT4KKyAgICAgICAgLCBib29zdDo6b3JkZXJlZF9maWVsZF9vcGVyYXRvcnMxPFdyYXBwZWQ1PFQsIFU+ID4KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBXcmFwcGVkNSggVCB2ID0gVCgpICkgOiBfdmFsdWUodikge30KKworICAgICAgICAvLyBDb252ZXJzaW9uIGZyb20gVSB0byBXcmFwcGVkNTxULFU+CisgICAgICAgIFdyYXBwZWQ1KFUgdSkgOiBfdmFsdWUodSkge30KKworICAgICAgICBUIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcjwoY29uc3QgV3JhcHBlZDUmIHgpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlIDwgeC5fdmFsdWU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcjwoVSB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA8IHU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcj4oVSB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA+IHU7IH0KKyAgICAgICAgY29udmVydGlibGVfdG9fYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdyYXBwZWQ1JiB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSB1Ll92YWx1ZTsgfQorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPT0oVSB1KSBjb25zdAorICAgICAgICAgIHsgcmV0dXJuIF92YWx1ZSA9PSB1OyB9CisKKyAgICAgICAgV3JhcHBlZDUmIG9wZXJhdG9yLz0oY29uc3QgV3JhcHBlZDUmIHUpIHsgX3ZhbHVlIC89IHUuX3ZhbHVlOyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNSYgb3BlcmF0b3IvPShVIHUpIHsgX3ZhbHVlIC89IHU7IHJldHVybiAqdGhpczt9CisgICAgICAgIFdyYXBwZWQ1JiBvcGVyYXRvcio9KGNvbnN0IFdyYXBwZWQ1JiB1KSB7IF92YWx1ZSAqPSB1Ll92YWx1ZTsgcmV0dXJuICp0aGlzO30KKyAgICAgICAgV3JhcHBlZDUmIG9wZXJhdG9yKj0oVSB1KSB7IF92YWx1ZSAqPSB1OyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNSYgb3BlcmF0b3ItPShjb25zdCBXcmFwcGVkNSYgdSkgeyBfdmFsdWUgLT0gdS5fdmFsdWU7IHJldHVybiAqdGhpczt9CisgICAgICAgIFdyYXBwZWQ1JiBvcGVyYXRvci09KFUgdSkgeyBfdmFsdWUgLT0gdTsgcmV0dXJuICp0aGlzO30KKyAgICAgICAgV3JhcHBlZDUmIG9wZXJhdG9yKz0oY29uc3QgV3JhcHBlZDUmIHUpIHsgX3ZhbHVlICs9IHUuX3ZhbHVlOyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNSYgb3BlcmF0b3IrPShVIHUpIHsgX3ZhbHVlICs9IHU7IHJldHVybiAqdGhpczt9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUIF92YWx1ZTsKKyAgICB9OworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICAgIFQgdHJ1ZV92YWx1ZShXcmFwcGVkNTxULFU+IHgpIHsgcmV0dXJuIHgudmFsdWUoKTsgfQorICAgIAorICAgIC8vIFUgbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBUCisgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CisgICAgY2xhc3MgV3JhcHBlZDYKKyAgICAgICAgOiBib29zdDo6b3JkZXJlZF9ldWNsaWRlYW5fcmluZ19vcGVyYXRvcnMyPFdyYXBwZWQ2PFQsIFU+LCBVPgorICAgICAgICAsIGJvb3N0OjpvcmRlcmVkX2V1Y2xpZGVhbl9yaW5nX29wZXJhdG9yczE8V3JhcHBlZDY8VCwgVT4gPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFdyYXBwZWQ2KCBUIHYgPSBUKCkgKSA6IF92YWx1ZSh2KSB7fQorCisgICAgICAgIC8vIENvbnZlcnNpb24gZnJvbSBVIHRvIFdyYXBwZWQ2PFQsVT4KKyAgICAgICAgV3JhcHBlZDYoVSB1KSA6IF92YWx1ZSh1KSB7fQorCisgICAgICAgIFQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBfdmFsdWU7IH0KKworICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPChjb25zdCBXcmFwcGVkNiYgeCkgY29uc3QKKyAgICAgICAgICB7IHJldHVybiBfdmFsdWUgPCB4Ll92YWx1ZTsgfQorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPChVIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlIDwgdTsgfQorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPihVIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlID4gdTsgfQorICAgICAgICBjb252ZXJ0aWJsZV90b19ib29sIG9wZXJhdG9yPT0oY29uc3QgV3JhcHBlZDYmIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IHUuX3ZhbHVlOyB9CisgICAgICAgIGNvbnZlcnRpYmxlX3RvX2Jvb2wgb3BlcmF0b3I9PShVIHUpIGNvbnN0CisgICAgICAgICAgeyByZXR1cm4gX3ZhbHVlID09IHU7IH0KKworICAgICAgICBXcmFwcGVkNiYgb3BlcmF0b3IlPShjb25zdCBXcmFwcGVkNiYgdSkgeyBfdmFsdWUgJT0gdS5fdmFsdWU7IHJldHVybiAqdGhpczt9CisgICAgICAgIFdyYXBwZWQ2JiBvcGVyYXRvciU9KFUgdSkgeyBfdmFsdWUgJT0gdTsgcmV0dXJuICp0aGlzO30KKyAgICAgICAgV3JhcHBlZDYmIG9wZXJhdG9yLz0oY29uc3QgV3JhcHBlZDYmIHUpIHsgX3ZhbHVlIC89IHUuX3ZhbHVlOyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNiYgb3BlcmF0b3IvPShVIHUpIHsgX3ZhbHVlIC89IHU7IHJldHVybiAqdGhpczt9CisgICAgICAgIFdyYXBwZWQ2JiBvcGVyYXRvcio9KGNvbnN0IFdyYXBwZWQ2JiB1KSB7IF92YWx1ZSAqPSB1Ll92YWx1ZTsgcmV0dXJuICp0aGlzO30KKyAgICAgICAgV3JhcHBlZDYmIG9wZXJhdG9yKj0oVSB1KSB7IF92YWx1ZSAqPSB1OyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNiYgb3BlcmF0b3ItPShjb25zdCBXcmFwcGVkNiYgdSkgeyBfdmFsdWUgLT0gdS5fdmFsdWU7IHJldHVybiAqdGhpczt9CisgICAgICAgIFdyYXBwZWQ2JiBvcGVyYXRvci09KFUgdSkgeyBfdmFsdWUgLT0gdTsgcmV0dXJuICp0aGlzO30KKyAgICAgICAgV3JhcHBlZDYmIG9wZXJhdG9yKz0oY29uc3QgV3JhcHBlZDYmIHUpIHsgX3ZhbHVlICs9IHUuX3ZhbHVlOyByZXR1cm4gKnRoaXM7fQorICAgICAgICBXcmFwcGVkNiYgb3BlcmF0b3IrPShVIHUpIHsgX3ZhbHVlICs9IHU7IHJldHVybiAqdGhpczt9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUIF92YWx1ZTsKKyAgICB9OworICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgorICAgIFQgdHJ1ZV92YWx1ZShXcmFwcGVkNjxULFU+IHgpIHsgcmV0dXJuIHgudmFsdWUoKTsgfQorICAgIAorICAgIC8vICBNeUludCB1c2VzIG9ubHkgdGhlIHNpbmdsZSB0ZW1wbGF0ZS1hcmd1bWVudCBmb3JtIG9mIGFsbF9vcGVyYXRvcnM8PgorICAgIHR5cGVkZWYgV3JhcHBlZDE8aW50PiBNeUludDsKKworICAgIHR5cGVkZWYgV3JhcHBlZDI8bG9uZywgbG9uZz4gTXlMb25nOworCisgICAgdHlwZWRlZiBXcmFwcGVkMzxzaWduZWQgY2hhcj4gTXlDaGFyOworCisgICAgdHlwZWRlZiBXcmFwcGVkNDxzaG9ydCwgc2hvcnQ+IE15U2hvcnQ7CisKKyAgICB0eXBlZGVmIFdyYXBwZWQ1PGRvdWJsZSwgaW50PiBNeURvdWJsZUludDsKKworICAgIHR5cGVkZWYgV3JhcHBlZDY8bG9uZywgaW50PiBNeUxvbmdJbnQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCBzYW5pdHlfY2hlY2soWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBCT09TVF9URVNUKCB0cnVlX3ZhbHVlKHkxKSA9PSB0cnVlX3ZhbHVlKHkyKSApOworICAgICAgICBCT09TVF9URVNUKCB0cnVlX3ZhbHVlKHgxKSA9PSB0cnVlX3ZhbHVlKHgyKSApOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfbGVzc190aGFuX2NvbXBhcmFibGVfYXV4KFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oeDEgPCB5MSkgPT0gc3RhdGljX2Nhc3Q8Ym9vbD4oeDIgPCB5MikgKTsKKyAgICAgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oeDEgPD0geTEpID09IHN0YXRpY19jYXN0PGJvb2w+KHgyIDw9IHkyKSApOworICAgICAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPih4MSA+PSB5MSkgPT0gc3RhdGljX2Nhc3Q8Ym9vbD4oeDIgPj0geTIpICk7CisgICAgICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KHgxID4geTEpID09IHN0YXRpY19jYXN0PGJvb2w+KHgyID4geTIpICk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfbGVzc190aGFuX2NvbXBhcmFibGUoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3RfbGVzc190aGFuX2NvbXBhcmFibGVfYXV4KCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X2xlc3NfdGhhbl9jb21wYXJhYmxlX2F1eCggeTEsIHgxLCB5MiwgeDIgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X2VxdWFsaXR5X2NvbXBhcmFibGVfYXV4KFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oeDEgPT0geTEpID09IHN0YXRpY19jYXN0PGJvb2w+KHgyID09IHkyKSApOworICAgICAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPih4MSAhPSB5MSkgPT0gc3RhdGljX2Nhc3Q8Ym9vbD4oeDIgIT0geTIpICk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfZXF1YWxpdHlfY29tcGFyYWJsZShYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIHNhbml0eV9jaGVjayggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9lcXVhbGl0eV9jb21wYXJhYmxlX2F1eCggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9lcXVhbGl0eV9jb21wYXJhYmxlX2F1eCggeTEsIHgxLCB5MiwgeDIgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X211bHRpcGxpYWJsZV9hdXgoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBCT09TVF9URVNUKCAoeDEgKiB5MSkudmFsdWUoKSA9PSAoeDIgKiB5MikgKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9tdWx0aXBsaWFibGUoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3RfbXVsdGlwbGlhYmxlX2F1eCggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9tdWx0aXBsaWFibGVfYXV4KCB5MSwgeDEsIHkyLCB4MiApOworICAgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQj4KKyAgdm9pZCB0ZXN0X3ZhbHVlX2VxdWFsaXR5KEEgYSwgQiBiKQorICB7CisgICAgICBCT09TVF9URVNUKGEudmFsdWUoKSA9PSBiKTsKKyAgfQorICAKKyNkZWZpbmUgVEVTVF9PUF9SKG9wKSB0ZXN0X3ZhbHVlX2VxdWFsaXR5KHgxIG9wIHkxLCB4MiBvcCB5MikKKyNkZWZpbmUgVEVTVF9PUF9MKG9wKSB0ZXN0X3ZhbHVlX2VxdWFsaXR5KHkxIG9wIHgxLCB5MiBvcCB4MikKKyAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9hZGRhYmxlX2F1eChYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIFRFU1RfT1BfUigrKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9hZGRhYmxlKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X2FkZGFibGVfYXV4KCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X2FkZGFibGVfYXV4KCB5MSwgeDEsIHkyLCB4MiApOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3Rfc3VidHJhY3RhYmxlKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICBURVNUX09QX1IoLSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9zdWJ0cmFjdGFibGVfbGVmdChYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIHNhbml0eV9jaGVjayggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgVEVTVF9PUF9MKC0pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfZGl2aWRhYmxlKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICBpZiAoIHkyICE9IDAgKQorICAgICAgICAgICAgVEVTVF9PUF9SKC8pOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X2RpdmlkYWJsZV9sZWZ0KFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICBpZiAoIHgyICE9IDAgKQorICAgICAgICAgICAgVEVTVF9PUF9MKC8pOworICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfbW9kYWJsZShYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIHNhbml0eV9jaGVjayggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgaWYgKCB5MiAhPSAwICkKKyAgICAgICAgICAgIFRFU1RfT1BfUiglKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9tb2RhYmxlX2xlZnQoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIGlmICggeDIgIT0gMCApCisgICAgICAgICAgICBURVNUX09QX0woJSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF94b3JhYmxlX2F1eChYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIFRFU1RfT1BfUiheKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF94b3JhYmxlKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X3hvcmFibGVfYXV4KCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X3hvcmFibGVfYXV4KCB5MSwgeDEsIHkyLCB4MiApOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X2FuZGFibGVfYXV4KFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgVEVTVF9PUF9SKCYpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X2FuZGFibGUoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3RfYW5kYWJsZV9hdXgoIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3RfYW5kYWJsZV9hdXgoIHkxLCB4MSwgeTIsIHgyICk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3Rfb3JhYmxlX2F1eChYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIFRFU1RfT1BfUih8KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9vcmFibGUoWDEgeDEsIFkxIHkxLCBYMiB4MiwgWTIgeTIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3Rfb3JhYmxlX2F1eCggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9vcmFibGVfYXV4KCB5MSwgeDEsIHkyLCB4MiApOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X2xlZnRfc2hpZnRhYmxlKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgc2FuaXR5X2NoZWNrKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICBURVNUX09QX1IoPDwpOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFkxLCBjbGFzcyBYMiwgY2xhc3MgWTI+CisgICAgdm9pZCB0ZXN0X3JpZ2h0X3NoaWZ0YWJsZShYMSB4MSwgWTEgeTEsIFgyIHgyLCBZMiB5MikKKyAgICB7CisgICAgICAgIHNhbml0eV9jaGVjayggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgVEVTVF9PUF9SKD4+KTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBYMj4KKyAgICB2b2lkIHRlc3RfaW5jcmVtZW50YWJsZShYMSB4MSwgWDIgeDIpCisgICAgeworICAgICAgICBzYW5pdHlfY2hlY2soIHgxLCB4MSwgeDIsIHgyICk7CisgICAgICAgIEJPT1NUX1RFU1QoICh4MSsrKS52YWx1ZSgpID09IHgyKysgKTsKKyAgICAgICAgQk9PU1RfVEVTVCggeDEudmFsdWUoKSA9PSB4MiApOworICAgIH0KKyAgICAKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgWDEsIGNsYXNzIFgyPgorICAgIHZvaWQgdGVzdF9kZWNyZW1lbnRhYmxlKFgxIHgxLCBYMiB4MikKKyAgICB7CisgICAgICAgIHNhbml0eV9jaGVjayggeDEsIHgxLCB4MiwgeDIgKTsKKyAgICAgICAgQk9PU1RfVEVTVCggKHgxLS0pLnZhbHVlKCkgPT0geDItLSApOworICAgICAgICBCT09TVF9URVNUKCB4MS52YWx1ZSgpID09IHgyICk7CisgICAgfQorICAgIAorICAgIHRlbXBsYXRlIDxjbGFzcyBYMSwgY2xhc3MgWTEsIGNsYXNzIFgyLCBjbGFzcyBZMj4KKyAgICB2b2lkIHRlc3RfYWxsKFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgdGVzdF9sZXNzX3RoYW5fY29tcGFyYWJsZSggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9lcXVhbGl0eV9jb21wYXJhYmxlKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X211bHRpcGxpYWJsZSggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9hZGRhYmxlKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X3N1YnRyYWN0YWJsZSggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9kaXZpZGFibGUoIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3RfbW9kYWJsZSggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF94b3JhYmxlKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X2FuZGFibGUoIHgxLCB5MSwgeDIsIHkyICk7CisgICAgICAgIHRlc3Rfb3JhYmxlKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X2xlZnRfc2hpZnRhYmxlKCB4MSwgeTEsIHgyLCB5MiApOworICAgICAgICB0ZXN0X3JpZ2h0X3NoaWZ0YWJsZSggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9pbmNyZW1lbnRhYmxlKCB4MSwgeDIgKTsKKyAgICAgICAgdGVzdF9kZWNyZW1lbnRhYmxlKCB4MSwgeDIgKTsKKyAgICB9CisgICAgCisgICAgdGVtcGxhdGUgPGNsYXNzIFgxLCBjbGFzcyBZMSwgY2xhc3MgWDIsIGNsYXNzIFkyPgorICAgIHZvaWQgdGVzdF9sZWZ0KFgxIHgxLCBZMSB5MSwgWDIgeDIsIFkyIHkyKQorICAgIHsKKyAgICAgICAgdGVzdF9zdWJ0cmFjdGFibGVfbGVmdCggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9kaXZpZGFibGVfbGVmdCggeDEsIHkxLCB4MiwgeTIgKTsKKyAgICAgICAgdGVzdF9tb2RhYmxlX2xlZnQoIHgxLCB5MSwgeDIsIHkyICk7CisgICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBCaWcsIGNsYXNzIFNtYWxsPgorICAgIHN0cnVjdCB0ZXN0ZXIKKyAgICB7CisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShib29zdDo6ZGV0YWlsOjptaW5zdGRfcmFuZCYgcmFuZG9taXplcikgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgQmlnICAgIGIxID0gQmlnKCByYW5kb21pemVyKCkgKTsKKyAgICAgICAgICAgIEJpZyAgICBiMiA9IEJpZyggcmFuZG9taXplcigpICk7CisgICAgICAgICAgICBTbWFsbCAgcyA9IFNtYWxsKCByYW5kb21pemVyKCkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdGVzdF9hbGwoIFdyYXBwZWQxPEJpZz4oYjEpLCBXcmFwcGVkMTxCaWc+KGIyKSwgYjEsIGIyICk7CisgICAgICAgICAgICB0ZXN0X2FsbCggV3JhcHBlZDI8QmlnLCBTbWFsbD4oYjEpLCBzLCBiMSwgcyApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBCaWcsIGNsYXNzIFNtYWxsPgorICAgIHN0cnVjdCB0ZXN0ZXJfbGVmdAorICAgIHsKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGJvb3N0OjpkZXRhaWw6Om1pbnN0ZF9yYW5kJiByYW5kb21pemVyKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBCaWcgICAgYjEgPSBCaWcoIHJhbmRvbWl6ZXIoKSApOworICAgICAgICAgICAgU21hbGwgIHMgPSBTbWFsbCggcmFuZG9taXplcigpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRlc3RfbGVmdCggV3JhcHBlZDY8QmlnLCBTbWFsbD4oYjEpLCBzLCBiMSwgcyApOworICAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBhZGRlZCBhcyBhIHJlZ3Jlc3Npb24gdGVzdC4gV2UgaGFkIGEgYnVnIHdoaWNoIHRoaXMgdW5jb3ZlcmVkLgorICAgIHN0cnVjdCBQb2ludAorICAgICAgICA6IGJvb3N0OjphZGRhYmxlPFBvaW50CisgICAgICAgICwgYm9vc3Q6OnN1YnRyYWN0YWJsZTxQb2ludD4gPgorICAgIHsKKyAgICAgICAgUG9pbnQoIGludCBoLCBpbnQgdiApIDogaChoKSwgdih2KSB7fQorICAgICAgICBQb2ludCgpIDpoKDApLCB2KDApIHt9CisgICAgICAgIGNvbnN0IFBvaW50JiBvcGVyYXRvcis9KCBjb25zdCBQb2ludCYgcmhzICkKKyAgICAgICAgICAgIHsgaCArPSByaHMuaDsgdiArPSByaHMudjsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIGNvbnN0IFBvaW50JiBvcGVyYXRvci09KCBjb25zdCBQb2ludCYgcmhzICkKKyAgICAgICAgICAgIHsgaCAtPSByaHMuaDsgdiAtPSByaHMudjsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgICAgaW50IGg7CisgICAgICAgIGludCB2OworICAgIH07CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworCisvLyB3b3JrYXJvdW5kIGZvciBNU1ZDIGJ1ZzsgZm9yIHNvbWUgcmVhc29ucyB0aGUgY29tcGlsZXIgZG9lc24ndCBpbnN0YW50aWF0ZQorLy8gaW5oZXJpdGVkIG9wZXJhdG9yIHRlbXBsYXRlcyBhdCB0aGUgbW9tZW50IGl0IG11c3QsIHNvIHRoZSBmb2xsb3dpbmcKKy8vIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIGZvcmNlIGl0IHRvIGRvIHRoYXQuCisKKyNpZiBkZWZpbmVkKEJPT1NUX01TVkMpICYmIChfTVNDX1ZFUiA8IDEzMDApCit0ZW1wbGF0ZSBXcmFwcGVkMTxpbnQ+OwordGVtcGxhdGUgV3JhcHBlZDE8bG9uZz47Cit0ZW1wbGF0ZSBXcmFwcGVkMTx1bnNpZ25lZCBpbnQ+OwordGVtcGxhdGUgV3JhcHBlZDE8dW5zaWduZWQgbG9uZz47CisKK3RlbXBsYXRlIFdyYXBwZWQyPGludCwgaW50PjsKK3RlbXBsYXRlIFdyYXBwZWQyPGludCwgc2lnbmVkIGNoYXI+OwordGVtcGxhdGUgV3JhcHBlZDI8bG9uZywgc2lnbmVkIGNoYXI+OwordGVtcGxhdGUgV3JhcHBlZDI8bG9uZywgaW50PjsKK3RlbXBsYXRlIFdyYXBwZWQyPGxvbmcsIGxvbmc+OwordGVtcGxhdGUgV3JhcHBlZDI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+OwordGVtcGxhdGUgV3JhcHBlZDI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBjaGFyPjsKK3RlbXBsYXRlIFdyYXBwZWQyPHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludD47Cit0ZW1wbGF0ZSBXcmFwcGVkMjx1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyPjsKK3RlbXBsYXRlIFdyYXBwZWQyPHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmc+OworCit0ZW1wbGF0ZSBXcmFwcGVkNjxsb25nLCBpbnQ+OwordGVtcGxhdGUgV3JhcHBlZDY8bG9uZywgc2lnbmVkIGNoYXI+OwordGVtcGxhdGUgV3JhcHBlZDY8aW50LCBzaWduZWQgY2hhcj47Cit0ZW1wbGF0ZSBXcmFwcGVkNjx1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQ+OwordGVtcGxhdGUgV3JhcHBlZDY8dW5zaWduZWQgbG9uZywgdW5zaWduZWQgY2hhcj47Cit0ZW1wbGF0ZSBXcmFwcGVkNjx1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGNoYXI+OworI2VuZGlmCisKKyNkZWZpbmUgUFJJVkFURV9FWFBSX1RFU1QoZSwgdCkgIEJPT1NUX1RFU1QoICgoZSksICh0KSkgKQorCitpbnQKK21haW4oKQoreworICAgIHVzaW5nIHN0ZDo6Y291dDsKKyAgICB1c2luZyBzdGQ6OmVuZGw7CisKKyAgICAvLyBSZWdyZXNzaW9uIHRlc3QuCisgICAgUG9pbnQgeDsKKyAgICB4ID0geCArIFBvaW50KDMsIDQpOworICAgIHggPSB4IC0gUG9pbnQoMywgNCk7CisgICAgCisgICAgY291dCA8PCAiQ3JlYXRlZCBwb2ludCwgYW5kIG9wZXJhdGVkIG9uIGl0LiIgPDwgZW5kbDsKKyAgICAKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IDEwMDA7ICsrbikgIC8vIHdhcyAxMCwwMDAgYnV0IHRvb2sgdG9vIGxvbmcgKEJlbWFuKQorICAgIHsKKyAgICAgICAgYm9vc3Q6OmRldGFpbDo6bWluc3RkX3JhbmQgcjsKKyAgICAgICAgdGVzdGVyPGxvbmcsIGludD4oKShyKTsKKyAgICAgICAgdGVzdGVyPGxvbmcsIHNpZ25lZCBjaGFyPigpKHIpOworICAgICAgICB0ZXN0ZXI8bG9uZywgbG9uZz4oKShyKTsKKyAgICAgICAgdGVzdGVyPGludCwgaW50PigpKHIpOworICAgICAgICB0ZXN0ZXI8aW50LCBzaWduZWQgY2hhcj4oKShyKTsKKyAgICAgICAgCisgICAgICAgIHRlc3Rlcjx1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQ+KCkocik7CisgICAgICAgIHRlc3Rlcjx1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyPigpKHIpOworICAgICAgICB0ZXN0ZXI8dW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZz4oKShyKTsKKyAgICAgICAgdGVzdGVyPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PigpKHIpOworICAgICAgICB0ZXN0ZXI8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBjaGFyPigpKHIpOworCisgICAgICAgIHRlc3Rlcl9sZWZ0PGxvbmcsIGludD4oKShyKTsKKyAgICAgICAgdGVzdGVyX2xlZnQ8bG9uZywgc2lnbmVkIGNoYXI+KCkocik7CisgICAgICAgIHRlc3Rlcl9sZWZ0PGludCwgc2lnbmVkIGNoYXI+KCkocik7CisKKyAgICAgICAgdGVzdGVyX2xlZnQ8dW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50PigpKHIpOworICAgICAgICB0ZXN0ZXJfbGVmdDx1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyPigpKHIpOworICAgICAgICB0ZXN0ZXJfbGVmdDx1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGNoYXI+KCkocik7CisgICAgfQorICAgIAorICAgIGNvdXQgPDwgIkRpZCByYW5kb20gdGVzdGVyIGxvb3AuIiA8PCBlbmRsOworCisgICAgTXlJbnQgaTEoMSk7CisgICAgTXlJbnQgaTIoMik7CisgICAgTXlJbnQgaTsKKworICAgIEJPT1NUX1RFU1QoIGkxLnZhbHVlKCkgPT0gMSApOworICAgIEJPT1NUX1RFU1QoIGkyLnZhbHVlKCkgPT0gMiApOworICAgIEJPT1NUX1RFU1QoIGkudmFsdWUoKSA9PSAwICk7CisKKyAgICBjb3V0IDw8ICJDcmVhdGVkIE15SW50IG9iamVjdHMuXG4iOworCisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaTIpLCAoaS52YWx1ZSgpID09IDIpICk7CisKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihpMiA9PSBpKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGkxICE9IGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGkxIDwgIGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGkxIDw9IGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGkgPD0gaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oaTIgPiAgaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oaTIgPj0gaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oaTIgPj0gaSkgKTsKKworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaSA9IGkxICsgaTIpLCAoaS52YWx1ZSgpID09IDMpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaSArIGkyKSwgKGkudmFsdWUoKSA9PSA1KSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaSA9IGkgLSBpMSksIChpLnZhbHVlKCkgPT0gNCkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGkgPSBpICogaTIpLCAoaS52YWx1ZSgpID09IDgpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaSAvIGkyKSwgKGkudmFsdWUoKSA9PSA0KSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaSA9IGkgJSAoIGkgLSBpMSApKSwgKGkudmFsdWUoKSA9PSAxKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaSA9IGkyICsgaTIpLCAoaS52YWx1ZSgpID09IDQpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaTEgfCBpMiB8IGkpLCAoaS52YWx1ZSgpID09IDcpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaSAmIGkyKSwgKGkudmFsdWUoKSA9PSAyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaSA9IGkgKyBpMSksIChpLnZhbHVlKCkgPT0gMykgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGkgPSBpIF4gaTEpLCAoaS52YWx1ZSgpID09IDIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gKCBpICsgaTEgKSAqICggaTIgfCBpMSApKSwgKGkudmFsdWUoKSA9PSA5KSApOworCisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaTEgPDwgaTIpLCAoaS52YWx1ZSgpID09IDQpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChpID0gaTIgPj4gaTEpLCAoaS52YWx1ZSgpID09IDEpICk7CisKKyAgICBjb3V0IDw8ICJQZXJmb3JtZWQgdGVzdHMgb24gTXlJbnQgb2JqZWN0cy5cbiI7CisKKyAgICBNeUxvbmcgajEoMSk7CisgICAgTXlMb25nIGoyKDIpOworICAgIE15TG9uZyBqOworCisgICAgQk9PU1RfVEVTVCggajEudmFsdWUoKSA9PSAxICk7CisgICAgQk9PU1RfVEVTVCggajIudmFsdWUoKSA9PSAyICk7CisgICAgQk9PU1RfVEVTVCggai52YWx1ZSgpID09IDAgKTsKKworICAgIGNvdXQgPDwgIkNyZWF0ZWQgTXlMb25nIG9iamVjdHMuXG4iOworCisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChqID0gajIpLCAoai52YWx1ZSgpID09IDIpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oajIgPT0gaikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigyID09IGopICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oajIgPT0gMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqID09IGoyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGoxICE9IGoyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGoxICE9IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAhPSBqMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqMSA8ICBqMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigxIDwgIGoyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGoxIDwgIDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oajEgPD0gajIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSA8PSBqMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqMSA8PSBqKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGogPD0gajIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiA8PSBqMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqIDw9IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oajIgPiAgajEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiA+ICBqMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqMiA+ICAxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGoyID49IGoxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDIgPj0gajEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oajIgPj0gMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqMiA+PSBqKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDIgPj0gaikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihqMiA+PSAyKSApOworCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGoxICsgMikgPT0gMykgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigoMSArIGoyKSA9PSAzKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGoxICsgajIpLCAoai52YWx1ZSgpID09IDMpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGogKyAyKSA9PSA1KSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KCgzICsgajIpID09IDUpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChqID0gaiArIGoyKSwgKGoudmFsdWUoKSA9PSA1KSApOworICAgIAorICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KChqIC0gMSkgPT0gNCkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGogPSBqIC0gajEpLCAoai52YWx1ZSgpID09IDQpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGogKiAyKSA9PSA4KSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KCg0ICogajIpID09IDgpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChqID0gaiAqIGoyKSwgKGoudmFsdWUoKSA9PSA4KSApOworICAgIAorICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KChqIC8gMikgPT0gNCkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGogPSBqIC8gajIpLCAoai52YWx1ZSgpID09IDQpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGogJSAzKSA9PSAxKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGogJSAoIGogLSBqMSApKSwgKGoudmFsdWUoKSA9PSAxKSApOworICAgIAorICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGoyICsgajIpLCAoai52YWx1ZSgpID09IDQpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKDEgfCBqMiB8IGopID09IDcpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGoxIHwgMiB8IGopID09IDcpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGoxIHwgajIgfCA0KSA9PSA3KSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGoxIHwgajIgfCBqKSwgKGoudmFsdWUoKSA9PSA3KSApOworICAgIAorICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KCg3ICYgajIpID09IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGogJiAyKSA9PSAyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGogJiBqMiksIChqLnZhbHVlKCkgPT0gMikgKTsKKyAgICAKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGogPSBqIHwgajEpLCAoai52YWx1ZSgpID09IDMpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKDMgXiBqMSkgPT0gMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigoaiBeIDEpID09IDIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChqID0gaiBeIGoxKSwgKGoudmFsdWUoKSA9PSAyKSApOworICAgIAorICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9ICggaiArIGoxICkgKiAoIGoyIHwgajEgKSksIChqLnZhbHVlKCkgPT0gOSkgKTsKKworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KChqMSA8PCAyKSA9PSA0KSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KChqMiA8PCAxKSA9PSA0KSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoaiA9IGoxIDw8IGoyKSwgKGoudmFsdWUoKSA9PSA0KSApOworCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oKGogPj4gMikgPT0gMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigoajIgPj4gMSkgPT0gMSkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGogPSBqMiA+PiBqMSksIChqLnZhbHVlKCkgPT0gMSkgKTsKKyAgICAKKyAgICBjb3V0IDw8ICJQZXJmb3JtZWQgdGVzdHMgb24gTXlMb25nIG9iamVjdHMuXG4iOworCisgICAgTXlDaGFyIGsxKDEpOworICAgIE15Q2hhciBrMigyKTsKKyAgICBNeUNoYXIgazsKKworICAgIEJPT1NUX1RFU1QoIGsxLnZhbHVlKCkgPT0gMSApOworICAgIEJPT1NUX1RFU1QoIGsyLnZhbHVlKCkgPT0gMiApOworICAgIEJPT1NUX1RFU1QoIGsudmFsdWUoKSA9PSAwICk7CisKKyAgICBjb3V0IDw8ICJDcmVhdGVkIE15Q2hhciBvYmplY3RzLlxuIjsKKworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAoayA9IGsyKSwgKGsudmFsdWUoKSA9PSAyKSApOworCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oazIgPT0gaykgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihrMSAhPSBrMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihrMSA8ICBrMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihrMSA8PSBrMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihrIDw9IGsyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGsyID4gIGsxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGsyID49IGsxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGsyID49IGspICk7CisgICAgCisgICAgY291dCA8PCAiUGVyZm9ybWVkIHRlc3RzIG9uIE15Q2hhciBvYmplY3RzLlxuIjsKKworICAgIE15U2hvcnQgbDEoMSk7CisgICAgTXlTaG9ydCBsMigyKTsKKyAgICBNeVNob3J0IGw7CisKKyAgICBCT09TVF9URVNUKCBsMS52YWx1ZSgpID09IDEgKTsKKyAgICBCT09TVF9URVNUKCBsMi52YWx1ZSgpID09IDIgKTsKKyAgICBCT09TVF9URVNUKCBsLnZhbHVlKCkgPT0gMCApOworCisgICAgY291dCA8PCAiQ3JlYXRlZCBNeVNob3J0IG9iamVjdHMuXG4iOworCisgICAgUFJJVkFURV9FWFBSX1RFU1QoIChsID0gbDIpLCAobC52YWx1ZSgpID09IDIpICk7CisgICAgCisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obDIgPT0gbCkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigyID09IGwpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obDIgPT0gMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsID09IGwyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGwxICE9IGwyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGwxICE9IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAhPSBsMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsMSA8ICBsMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigxIDwgIGwyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGwxIDwgIDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obDEgPD0gbDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSA8PSBsMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsMSA8PSBsKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGwgPD0gbDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiA8PSBsMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsIDw9IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obDIgPiAgbDEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiA+ICBsMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsMiA+ICAxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGwyID49IGwxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDIgPj0gbDEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obDIgPj0gMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsMiA+PSBsKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDIgPj0gbCkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsMiA+PSAyKSApOworICAgIAorICAgIGNvdXQgPDwgIlBlcmZvcm1lZCB0ZXN0cyBvbiBNeVNob3J0IG9iamVjdHMuXG4iOworICAgIAorICAgIE15RG91YmxlSW50IGRpMSgxKTsKKyAgICBNeURvdWJsZUludCBkaTIoMi4pOworICAgIE15RG91YmxlSW50IGhhbGYoMC41KTsKKyAgICBNeURvdWJsZUludCBkaTsKKyAgICBNeURvdWJsZUludCB0bXA7CisKKyAgICBCT09TVF9URVNUKCBkaTEudmFsdWUoKSA9PSAxICk7CisgICAgQk9PU1RfVEVTVCggZGkyLnZhbHVlKCkgPT0gMiApOworICAgIEJPT1NUX1RFU1QoIGRpMi52YWx1ZSgpID09IDIgKTsKKyAgICBCT09TVF9URVNUKCBkaS52YWx1ZSgpID09IDAgKTsKKworICAgIGNvdXQgPDwgIkNyZWF0ZWQgTXlEb3VibGVJbnQgb2JqZWN0cy5cbiI7CisKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKGRpID0gZGkyKSwgKGRpLnZhbHVlKCkgPT0gMikgKTsKKyAgICAKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihkaTIgPT0gZGkpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiA9PSBkaSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihkaSA9PSAyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMSA8IGRpMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigxIDwgZGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMSA8PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSA8PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oZGkyID4gZGkxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMiA+IDEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oZGkyID49IGRpMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihkaTIgPj0gMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihkaTEgLyBkaTIgPT0gaGFsZikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihkaTEgLyAyID09IGhhbGYpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAvIGRpMiA9PSBoYWxmKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wPWRpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAvPTIpID09IGhhbGYpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXA9ZGkxKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcC89ZGkyKSA9PSBoYWxmKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMSAqIGRpMiA9PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oZGkxICogMiA9PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAqIGRpMiA9PSBkaTIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXA9ZGkxKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcCo9MikgPT0gZGkyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wPWRpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAqPWRpMikgPT0gZGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMiAtIGRpMSA9PSBkaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oZGkyIC0gMSA9PSBkaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMiAtIGRpMSA9PSBkaTEpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXA9ZGkyKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcC09MSkgPT0gZGkxKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wPWRpMiksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAtPWRpMSkgPT0gZGkxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGRpMSArIGRpMSA9PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oZGkxICsgMSA9PSBkaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSArIGRpMSA9PSBkaTIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXA9ZGkxKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcCs9MSkgPT0gZGkyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wPWRpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXArPWRpMSkgPT0gZGkyKSApOworCisgICAgY291dCA8PCAiUGVyZm9ybWVkIHRlc3RzIG9uIE15RG91YmxlSW50IG9iamVjdHMuXG4iOworCisgICAgTXlMb25nSW50IGxpMSgxKTsKKyAgICBNeUxvbmdJbnQgbGkyKDIpOworICAgIE15TG9uZ0ludCBsaTsKKyAgICBNeUxvbmdJbnQgdG1wMjsKKworICAgIEJPT1NUX1RFU1QoIGxpMS52YWx1ZSgpID09IDEgKTsKKyAgICBCT09TVF9URVNUKCBsaTIudmFsdWUoKSA9PSAyICk7CisgICAgQk9PU1RfVEVTVCggbGkudmFsdWUoKSA9PSAwICk7CisKKyAgICBjb3V0IDw8ICJDcmVhdGVkIE15TG9uZ0ludCBvYmplY3RzLlxuIjsKKworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAobGkgPSBsaTIpLCAobGkudmFsdWUoKSA9PSAyKSApOworICAgIAorICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpMiA9PSBsaSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigyID09IGxpKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpID09IDIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkxIDwgbGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDEgPCBsaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkxIDw9IGxpMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigxIDw9IGxpMikgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTIgPiBsaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkyID4gMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTIgPj0gbGkxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpMiA+PSAxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpMSAlIGxpMiA9PSBsaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkxICUgMiA9PSBsaTEpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAlIGxpMiA9PSBsaTEpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXAyPWxpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAyJT0yKSA9PSBsaTEpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXAyPWxpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAyJT1saTIpID09IGxpMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTEgLyBsaTIgPT0gMCkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTEgLyAyID09IDApICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSAvIGxpMiA9PSAwKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wMj1saTEpLCBzdGF0aWNfY2FzdDxib29sPigodG1wMi89MikgPT0gMCkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKHRtcDI9bGkxKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcDIvPWxpMikgPT0gMCkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTEgKiBsaTIgPT0gbGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpMSAqIDIgPT0gbGkyKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KDEgKiBsaTIgPT0gbGkyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wMj1saTEpLCBzdGF0aWNfY2FzdDxib29sPigodG1wMio9MikgPT0gbGkyKSApOworICAgIFBSSVZBVEVfRVhQUl9URVNUKCAodG1wMj1saTEpLCBzdGF0aWNfY2FzdDxib29sPigodG1wMio9bGkyKSA9PSBsaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkyIC0gbGkxID09IGxpMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPihsaTIgLSAxID09IGxpMSkgKTsKKyAgICBCT09TVF9URVNUKCBzdGF0aWNfY2FzdDxib29sPigyIC0gbGkxID09IGxpMSkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKHRtcDI9bGkyKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcDItPTEpID09IGxpMSkgKTsKKyAgICBQUklWQVRFX0VYUFJfVEVTVCggKHRtcDI9bGkyKSwgc3RhdGljX2Nhc3Q8Ym9vbD4oKHRtcDItPWxpMSkgPT0gbGkxKSApOworICAgIEJPT1NUX1RFU1QoIHN0YXRpY19jYXN0PGJvb2w+KGxpMSArIGxpMSA9PSBsaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4obGkxICsgMSA9PSBsaTIpICk7CisgICAgQk9PU1RfVEVTVCggc3RhdGljX2Nhc3Q8Ym9vbD4oMSArIGxpMSA9PSBsaTIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXAyPWxpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAyKz0xKSA9PSBsaTIpICk7CisgICAgUFJJVkFURV9FWFBSX1RFU1QoICh0bXAyPWxpMSksIHN0YXRpY19jYXN0PGJvb2w+KCh0bXAyKz1saTEpID09IGxpMikgKTsKKworICAgIGNvdXQgPDwgIlBlcmZvcm1lZCB0ZXN0cyBvbiBNeUxvbmdJbnQgb2JqZWN0cy5cbiI7CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvcmVzdWx0X29mX3Rlc3QuY3BwIGIvdGVzdC9yZXN1bHRfb2ZfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMDQzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVzdWx0X29mX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvLyBCb29zdCByZXN1bHRfb2YgbGlicmFyeQorCisvLyAgQ29weXJpZ2h0IERvdWdsYXMgR3JlZ29yIDIwMDMtMjAwNC4gVXNlLCBtb2RpZmljYXRpb24gYW5kCisvLyAgZGlzdHJpYnV0aW9uIGlzIHN1YmplY3QgdG8gdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24KKy8vICAxLjAuIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKy8vIEV4YW1wbGVzOgorLy8gICBUbyBydW4gdGhlIGRlZmF1bHQgdGVzdDoKKy8vICAgJCBjZCBsaWJzL3V0aWxpdHkvdGVzdCAmJiBiamFtCisvLyAgIFRvIHRlc3QgZGVjbHR5cGUgb24gZysrIDIuNzoKKy8vICAgJCBjZCBsaWJzL3V0aWxpdHkvdGVzdCAmJiBiamFtIGN4eGZsYWdzPSItc3RkPWMrKzExIC1EIEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUiCisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorCisvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvdXRpbGl0eQorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvcmVzdWx0X29mLmhwcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX3NhbWUuaHBwPgorCitzdHJ1Y3QgaW50X3Jlc3VsdF90eXBlCit7CisgIHR5cGVkZWYgaW50IHJlc3VsdF90eXBlOworICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKGZsb2F0KTsKK307CisKK3N0cnVjdCBpbnRfcmVzdWx0X29mCit7CisgIHRlbXBsYXRlPHR5cGVuYW1lIEY+IHN0cnVjdCByZXN1bHQgeyB0eXBlZGVmIGludCB0eXBlOyB9OworICByZXN1bHQ8aW50X3Jlc3VsdF9vZihkb3VibGUpPjo6dHlwZSBvcGVyYXRvcigpKGRvdWJsZSk7CisgIHJlc3VsdDxjb25zdCBpbnRfcmVzdWx0X29mKGRvdWJsZSk+Ojp0eXBlIG9wZXJhdG9yKCkoZG91YmxlKSBjb25zdDsKKyAgcmVzdWx0PGludF9yZXN1bHRfb2YoKT46OnR5cGUgb3BlcmF0b3IoKSgpOworICByZXN1bHQ8dm9sYXRpbGUgaW50X3Jlc3VsdF9vZigpPjo6dHlwZSBvcGVyYXRvcigpKCkgdm9sYXRpbGU7Cit9OworCitzdHJ1Y3QgaW50X3Jlc3VsdF90eXBlX2FuZF9mbG9hdF9yZXN1bHRfb2ZfYW5kX2NoYXJfcmV0dXJuCit7CisgIHR5cGVkZWYgaW50IHJlc3VsdF90eXBlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdHJ1Y3QgcmVzdWx0IHsgdHlwZWRlZiBmbG9hdCB0eXBlOyB9OworICBjaGFyIG9wZXJhdG9yKCkoY2hhcik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGludF9yZXN1bHRfdHlwZV90ZW1wbGF0ZQoreworICB0eXBlZGVmIGludCByZXN1bHRfdHlwZTsKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShmbG9hdCk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGludF9yZXN1bHRfb2ZfdGVtcGxhdGUKK3sKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRj4gc3RydWN0IHJlc3VsdDsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDxUaGlzKFRoYXQpPiB7IHR5cGVkZWYgaW50IHR5cGU7IH07CisgIHR5cGVuYW1lIHJlc3VsdDxpbnRfcmVzdWx0X29mX3RlbXBsYXRlPFQ+KGRvdWJsZSk+Ojp0eXBlIG9wZXJhdG9yKCkoZG91YmxlKTsKKyAgdHlwZW5hbWUgcmVzdWx0PGNvbnN0IGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8VD4oZG91YmxlKT46OnR5cGUgb3BlcmF0b3IoKShkb3VibGUpIGNvbnN0OworICB0eXBlbmFtZSByZXN1bHQ8aW50X3Jlc3VsdF9vZl90ZW1wbGF0ZTxUPihkb3VibGUpPjo6dHlwZSBvcGVyYXRvcigpKCk7CisgIHR5cGVuYW1lIHJlc3VsdDx2b2xhdGlsZSBpbnRfcmVzdWx0X29mX3RlbXBsYXRlPFQ+KGRvdWJsZSk+Ojp0eXBlIG9wZXJhdG9yKCkoKSB2b2xhdGlsZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaW50X3Jlc3VsdF90eXBlX2FuZF9mbG9hdF9yZXN1bHRfb2ZfYW5kX2NoYXJfcmV0dXJuX3RlbXBsYXRlCit7CisgIHR5cGVkZWYgaW50IHJlc3VsdF90eXBlOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdHJ1Y3QgcmVzdWx0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGlzLCB0eXBlbmFtZSBUaGF0PiBzdHJ1Y3QgcmVzdWx0PFRoaXMoVGhhdCk+IHsgdHlwZWRlZiBmbG9hdCB0eXBlOyB9OworICBjaGFyIG9wZXJhdG9yKCkoY2hhcik7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGN2X292ZXJsb2FkX2NoZWNrIHt9OworCitzdHJ1Y3QgcmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZQoreworICB0ZW1wbGF0ZTx0eXBlbmFtZSBGPiBzdHJ1Y3QgcmVzdWx0OworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRoaXMsIHR5cGVuYW1lIFRoYXQ+IHN0cnVjdCByZXN1bHQ8VGhpcyhUaGF0KT4geyB0eXBlZGVmIFRoYXQgdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCk+Ojp0eXBlIG9wZXJhdG9yKCkoVCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDxjb25zdCBUaGlzKFRoYXQpPiB7IHR5cGVkZWYgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3QgVGhhdD4gdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PGNvbnN0IHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCk+Ojp0eXBlIG9wZXJhdG9yKCkoVCkgY29uc3Q7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDx2b2xhdGlsZSBUaGlzKFRoYXQpPiB7IHR5cGVkZWYgY3Zfb3ZlcmxvYWRfY2hlY2s8dm9sYXRpbGUgVGhhdD4gdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PHZvbGF0aWxlIHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCk+Ojp0eXBlIG9wZXJhdG9yKCkoVCkgdm9sYXRpbGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDxjb25zdCB2b2xhdGlsZSBUaGlzKFRoYXQpPiB7IHR5cGVkZWYgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3Qgdm9sYXRpbGUgVGhhdD4gdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PGNvbnN0IHZvbGF0aWxlIHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCk+Ojp0eXBlIG9wZXJhdG9yKCkoVCkgY29uc3Qgdm9sYXRpbGU7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDxUaGlzKFRoYXQgJiwgVGhhdCk+IHsgdHlwZWRlZiBUaGF0ICYgdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCAmLCBUKT46OnR5cGUgb3BlcmF0b3IoKShUICYsIFQpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRoaXMsIHR5cGVuYW1lIFRoYXQ+IHN0cnVjdCByZXN1bHQ8VGhpcyhUaGF0IGNvbnN0ICYsIFRoYXQpPiB7IHR5cGVkZWYgVGhhdCBjb25zdCAmIHR5cGU7IH07CisgIHRlbXBsYXRlPGNsYXNzIFQ+IHR5cGVuYW1lIHJlc3VsdDxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKFQgY29uc3QgJiwgVCk+Ojp0eXBlIG9wZXJhdG9yKCkoVCBjb25zdCAmLCBUKTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGlzLCB0eXBlbmFtZSBUaGF0PiBzdHJ1Y3QgcmVzdWx0PFRoaXMoVGhhdCB2b2xhdGlsZSAmLCBUaGF0KT4geyB0eXBlZGVmIFRoYXQgdm9sYXRpbGUgJiB0eXBlOyB9OworICB0ZW1wbGF0ZTxjbGFzcyBUPiB0eXBlbmFtZSByZXN1bHQ8cmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShUIHZvbGF0aWxlICYsIFQpPjo6dHlwZSBvcGVyYXRvcigpKFQgdm9sYXRpbGUgJiwgVCk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVGhpcywgdHlwZW5hbWUgVGhhdD4gc3RydWN0IHJlc3VsdDxUaGlzKFRoYXQgY29uc3Qgdm9sYXRpbGUgJiwgVGhhdCk+IHsgdHlwZWRlZiBUaGF0IGNvbnN0IHZvbGF0aWxlICYgdHlwZTsgfTsKKyAgdGVtcGxhdGU8Y2xhc3MgVD4gdHlwZW5hbWUgcmVzdWx0PHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoVCBjb25zdCB2b2xhdGlsZSAmLCBUKT46OnR5cGUgb3BlcmF0b3IoKShUIGNvbnN0IHZvbGF0aWxlICYsIFQpOworfTsKKworc3RydWN0IG5vX3Jlc3VsdF90eXBlX29yX3Jlc3VsdAoreworICBzaG9ydCBvcGVyYXRvcigpKGRvdWJsZSk7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgY29uc3Q7CisgIGN2X292ZXJsb2FkX2NoZWNrPHZvbGF0aWxlIHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgdm9sYXRpbGU7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHZvbGF0aWxlIHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgY29uc3Qgdm9sYXRpbGU7CisgIGludCBvcGVyYXRvcigpKCk7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IGludD4gb3BlcmF0b3IoKSgpIGNvbnN0OworICBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBpbnQ+IG9wZXJhdG9yKCkoKSB2b2xhdGlsZTsKKyAgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3Qgdm9sYXRpbGUgaW50PiBvcGVyYXRvcigpKCkgY29uc3Qgdm9sYXRpbGU7CisjaWYgIWRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMpCisgIHNob3J0IG9wZXJhdG9yKCkoaW50JiYpOworICBpbnQgb3BlcmF0b3IoKShpbnQmKTsKKyAgbG9uZyBvcGVyYXRvcigpKGludCBjb25zdCYpOworI2VuZGlmCit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IG5vX3Jlc3VsdF90eXBlX29yX3Jlc3VsdF90ZW1wbGF0ZQoreworICBzaG9ydCBvcGVyYXRvcigpKGRvdWJsZSk7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgY29uc3Q7CisgIGN2X292ZXJsb2FkX2NoZWNrPHZvbGF0aWxlIHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgdm9sYXRpbGU7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHZvbGF0aWxlIHNob3J0PiBvcGVyYXRvcigpKGRvdWJsZSkgY29uc3Qgdm9sYXRpbGU7CisgIGludCBvcGVyYXRvcigpKCk7CisgIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IGludD4gb3BlcmF0b3IoKSgpIGNvbnN0OworICBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBpbnQ+IG9wZXJhdG9yKCkoKSB2b2xhdGlsZTsKKyAgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3Qgdm9sYXRpbGUgaW50PiBvcGVyYXRvcigpKCkgY29uc3Qgdm9sYXRpbGU7CisjaWYgIWRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMpCisgIHNob3J0IG9wZXJhdG9yKCkoaW50JiYpOworICBpbnQgb3BlcmF0b3IoKShpbnQmKTsKKyAgbG9uZyBvcGVyYXRvcigpKGludCBjb25zdCYpOworI2VuZGlmCit9OworCisvLyBzZmluYWVfdGVzdHMgYXJlIGRlcml2ZWQgZnJvbSBleGFtcGxlIGNvZGUgZnJvbSBKb2VsIGRlIEd1em1hbiwKKy8vIHdoaWNoIGRlbW9uc3RyYXRlZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiByZXN1bHRfb2YgYW5kIFNGSU5BRS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSBBcmc+Cit0eXBlbmFtZSBib29zdDo6cmVzdWx0X29mPEYoQXJnIGNvbnN0Jik+Ojp0eXBlCitzZmluYWVfdGVzdChGIGYsIEFyZyBjb25zdCYgYXJnKQoreworICAgIHJldHVybiBmKGFyZyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSBBcmc+Cit0eXBlbmFtZSBib29zdDo6cmVzdWx0X29mPEYoQXJnJik+Ojp0eXBlCitzZmluYWVfdGVzdChGIGYsIEFyZyYgYXJnKQoreworICAgIHJldHVybiBmKGFyZyk7Cit9CisKK2ludCBzZmluYWVfdGVzdF9mKGludCYgaSkKK3sKKyAgICByZXR1cm4gaTsKK30KKworc3RydWN0IFgge307CisKK2ludCBtYWluKCkKK3sKKyAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworCisgIHR5cGVkZWYgaW50ICgqZnVuY19wdHIpKGZsb2F0LCBkb3VibGUpOworICB0eXBlZGVmIGludCAoJmZ1bmNfcmVmKShmbG9hdCwgZG91YmxlKTsKKyAgdHlwZWRlZiBpbnQgKCpmdW5jX3B0cl8wKSgpOworICB0eXBlZGVmIGludCAoJmZ1bmNfcmVmXzApKCk7CisgIHR5cGVkZWYgdm9pZCAoKmZ1bmNfcHRyX3ZvaWQpKGZsb2F0LCBkb3VibGUpOworICB0eXBlZGVmIHZvaWQgKCZmdW5jX3JlZl92b2lkKShmbG9hdCwgZG91YmxlKTsKKyAgdHlwZWRlZiB2b2lkICgqZnVuY19wdHJfdm9pZF8wKSgpOworICB0eXBlZGVmIHZvaWQgKCZmdW5jX3JlZl92b2lkXzApKCk7CisgIHR5cGVkZWYgaW50IChYOjoqbWVtX2Z1bmNfcHRyKShmbG9hdCk7CisgIHR5cGVkZWYgaW50IChYOjoqbWVtX2Z1bmNfcHRyX2MpKGZsb2F0KSBjb25zdDsKKyAgdHlwZWRlZiBpbnQgKFg6OiptZW1fZnVuY19wdHJfdikoZmxvYXQpIHZvbGF0aWxlOworICB0eXBlZGVmIGludCAoWDo6Km1lbV9mdW5jX3B0cl9jdikoZmxvYXQpIGNvbnN0IHZvbGF0aWxlOworICB0eXBlZGVmIGludCAoWDo6Km1lbV9mdW5jX3B0cl8wKSgpOworCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGludF9yZXN1bHRfdHlwZShmbG9hdCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X29mKGRvdWJsZSk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxjb25zdCBpbnRfcmVzdWx0X29mKGRvdWJsZSk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X3R5cGVfdGVtcGxhdGU8dm9pZD4oZmxvYXQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8aW50X3Jlc3VsdF9vZl90ZW1wbGF0ZTx2b2lkPihkb3VibGUpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3QgaW50X3Jlc3VsdF9vZl90ZW1wbGF0ZTx2b2lkPihkb3VibGUpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8aW50X3Jlc3VsdF90eXBlKGZsb2F0KT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxpbnRfcmVzdWx0X29mKGRvdWJsZSk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8Y29uc3QgaW50X3Jlc3VsdF9vZihkb3VibGUpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGludF9yZXN1bHRfdHlwZV90ZW1wbGF0ZTx2b2lkPihmbG9hdCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8aW50X3Jlc3VsdF9vZl90ZW1wbGF0ZTx2b2lkPihkb3VibGUpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGNvbnN0IGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8dm9pZD4oZG91YmxlKT46OnR5cGUsIGludD46OnZhbHVlKSk7CisKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGludF9yZXN1bHRfb2Yodm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPHZvbGF0aWxlIGludF9yZXN1bHRfb2Yodm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8dm9pZD4odm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPHZvbGF0aWxlIGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8dm9pZD4odm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKworICAvLyBQcmlvciB0byBkZWNsdHlwZSwgcmVzdWx0X29mIGNvdWxkIG5vdCBkZWR1Y2UgdGhlIHJldHVybiB0eXBlCisgIC8vIG9mIG51bGxhcnkgZnVuY3Rpb24gb2JqZWN0cyB1bmxlc3MgdGhleSBleHBvc2VkIGEgcmVzdWx0X3R5cGUuCisjaWYgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFKQorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X29mKHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8dm9sYXRpbGUgaW50X3Jlc3VsdF9vZih2b2lkKT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8dm9pZD4odm9pZCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjx2b2xhdGlsZSBpbnRfcmVzdWx0X29mX3RlbXBsYXRlPHZvaWQ+KHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyNlbHNlCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGludF9yZXN1bHRfb2Yodm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8dm9sYXRpbGUgaW50X3Jlc3VsdF9vZih2b2lkKT46OnR5cGUsIHZvaWQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X29mX3RlbXBsYXRlPHZvaWQ+KHZvaWQpPjo6dHlwZSwgdm9pZD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPHZvbGF0aWxlIGludF9yZXN1bHRfb2ZfdGVtcGxhdGU8dm9pZD4odm9pZCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyNlbmRpZgorCisgIC8vIFByaW9yIHRvIGRlY2x0eXBlLCByZXN1bHRfb2YgaWdub3JlZCBhIG5lc3RlZCByZXN1bHQ8PiBpZgorICAvLyByZXN1bHRfdHlwZSB3YXMgZGVmaW5lZC4gQWZ0ZXIgZGVjbHR5cGUsIHJlc3VsdF9vZiBkZWR1Y2VzIHRoZQorICAvLyBhY3R1YWwgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdCwgaWdub3JpbmcgYm90aAorICAvLyByZXN1bHQ8PiBhbmQgcmVzdWx0X3R5cGUuCisjaWYgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFKQorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X3R5cGVfYW5kX2Zsb2F0X3Jlc3VsdF9vZl9hbmRfY2hhcl9yZXR1cm4oY2hhcik+Ojp0eXBlLCBjaGFyPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8aW50X3Jlc3VsdF90eXBlX2FuZF9mbG9hdF9yZXN1bHRfb2ZfYW5kX2NoYXJfcmV0dXJuX3RlbXBsYXRlPHZvaWQ+KGNoYXIpPjo6dHlwZSwgY2hhcj46OnZhbHVlKSk7CisjZWxzZQorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X3R5cGVfYW5kX2Zsb2F0X3Jlc3VsdF9vZl9hbmRfY2hhcl9yZXR1cm4oY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X3R5cGVfYW5kX2Zsb2F0X3Jlc3VsdF9vZl9hbmRfY2hhcl9yZXR1cm5fdGVtcGxhdGU8dm9pZD4oY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworI2VuZGlmCisKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGludF9yZXN1bHRfdHlwZV9hbmRfZmxvYXRfcmVzdWx0X29mX2FuZF9jaGFyX3JldHVybihjaGFyKT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxpbnRfcmVzdWx0X3R5cGVfYW5kX2Zsb2F0X3Jlc3VsdF9vZl9hbmRfY2hhcl9yZXR1cm5fdGVtcGxhdGU8dm9pZD4oY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGZ1bmNfcHRyKGNoYXIsIGZsb2F0KT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGZ1bmNfcmVmKGNoYXIsIGZsb2F0KT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGZ1bmNfcHRyXzAoKT46OnR5cGUsIGludD46OnZhbHVlKSk7IAorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxmdW5jX3JlZl8wKCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOyAKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8ZnVuY19wdHJfdm9pZChjaGFyLCBmbG9hdCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8ZnVuY19yZWZfdm9pZChjaGFyLCBmbG9hdCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8ZnVuY19wdHJfdm9pZF8wKCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsgCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGZ1bmNfcmVmX3ZvaWRfMCgpPjo6dHlwZSwgdm9pZD46OnZhbHVlKSk7IAorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxtZW1fZnVuY19wdHIoWCxjaGFyKT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPG1lbV9mdW5jX3B0cl9jKFgsY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxtZW1fZnVuY19wdHJfdihYLGNoYXIpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bWVtX2Z1bmNfcHRyX2N2KFgsY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxtZW1fZnVuY19wdHJfMChYKT46OnR5cGUsIGludD46OnZhbHVlKSk7IAorCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxmdW5jX3B0cihjaGFyLCBmbG9hdCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8ZnVuY19yZWYoY2hhciwgZmxvYXQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGZ1bmNfcHRyXzAoKT46OnR5cGUsIGludD46OnZhbHVlKSk7IAorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8ZnVuY19yZWZfMCgpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsgCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxmdW5jX3B0cl92b2lkKGNoYXIsIGZsb2F0KT46OnR5cGUsIHZvaWQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8ZnVuY19yZWZfdm9pZChjaGFyLCBmbG9hdCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGZ1bmNfcHRyX3ZvaWRfMCgpPjo6dHlwZSwgdm9pZD46OnZhbHVlKSk7IAorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8ZnVuY19yZWZfdm9pZF8wKCk+Ojp0eXBlLCB2b2lkPjo6dmFsdWUpKTsgCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxtZW1fZnVuY19wdHIoWCxjaGFyKT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxtZW1fZnVuY19wdHJfYyhYLGNoYXIpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPG1lbV9mdW5jX3B0cl92KFgsY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8bWVtX2Z1bmNfcHRyX2N2KFgsY2hhcik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8bWVtX2Z1bmNfcHRyXzAoWCk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOyAKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGZ1bmNfcHRyKHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPGZ1bmNfcmVmKHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGRvdWJsZSk+Ojp0eXBlLCBkb3VibGU+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxjb25zdCByZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazxjb25zdCBkb3VibGU+ID46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPHZvbGF0aWxlIHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoZG91YmxlKT46OnR5cGUsIGN2X292ZXJsb2FkX2NoZWNrPHZvbGF0aWxlIGRvdWJsZT4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgdm9sYXRpbGUgcmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShkb3VibGUpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3Qgdm9sYXRpbGUgZG91YmxlPiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGludCAmLCBpbnQpPjo6dHlwZSwgaW50ICY+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGludCBjb25zdCAmLCBpbnQpPjo6dHlwZSwgaW50IGNvbnN0ICY+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGludCB2b2xhdGlsZSAmLCBpbnQpPjo6dHlwZSwgaW50IHZvbGF0aWxlICY+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGludCBjb25zdCB2b2xhdGlsZSAmLCBpbnQpPjo6dHlwZSwgaW50IGNvbnN0IHZvbGF0aWxlICY+Ojp2YWx1ZSkpOworCisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGRvdWJsZSk+Ojp0eXBlLCBkb3VibGU+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8Y29uc3QgcmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShkb3VibGUpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3QgZG91YmxlPiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8dm9sYXRpbGUgcmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShkb3VibGUpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8dm9sYXRpbGUgZG91YmxlPiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8Y29uc3Qgdm9sYXRpbGUgcmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShkb3VibGUpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3Qgdm9sYXRpbGUgZG91YmxlPiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8cmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShpbnQgJiwgaW50KT46OnR5cGUsIGludCAmPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPHJlc3VsdF9vZl9tZW1iZXJfZnVuY3Rpb25fdGVtcGxhdGUoaW50IGNvbnN0ICYsIGludCk+Ojp0eXBlLCBpbnQgY29uc3QgJj46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8dHIxX3Jlc3VsdF9vZjxyZXN1bHRfb2ZfbWVtYmVyX2Z1bmN0aW9uX3RlbXBsYXRlKGludCB2b2xhdGlsZSAmLCBpbnQpPjo6dHlwZSwgaW50IHZvbGF0aWxlICY+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8cmVzdWx0X29mX21lbWJlcl9mdW5jdGlvbl90ZW1wbGF0ZShpbnQgY29uc3Qgdm9sYXRpbGUgJiwgaW50KT46OnR5cGUsIGludCBjb25zdCB2b2xhdGlsZSAmPjo6dmFsdWUpKTsKKworICB0eXBlZGVmIGludCAoKnBmX3QpKGludCk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPHBmX3QoaW50KT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPHBmX3QgY29uc3QoaW50KT46OnR5cGUsaW50Pjo6dmFsdWUpKTsKKworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHRyMV9yZXN1bHRfb2Y8cGZfdChpbnQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTx0cjFfcmVzdWx0X29mPHBmX3QgY29uc3QoaW50KT46OnR5cGUsaW50Pjo6dmFsdWUpKTsKKworI2lmIGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRSkgfHwgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX1RSMV9XSVRIX0RFQ0xUWVBFX0ZBTExCQUNLKQorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxub19yZXN1bHRfdHlwZV9vcl9yZXN1bHQoZG91YmxlKT46OnR5cGUsIHNob3J0Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazxjb25zdCBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8dm9sYXRpbGUgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgdm9sYXRpbGUgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazxjb25zdCB2b2xhdGlsZSBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0KHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0KHZvaWQpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3QgaW50PiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjx2b2xhdGlsZSBub19yZXN1bHRfdHlwZV9vcl9yZXN1bHQodm9pZCk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBpbnQ+ID46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGNvbnN0IHZvbGF0aWxlIG5vX3Jlc3VsdF90eXBlX29yX3Jlc3VsdCh2b2lkKT46OnR5cGUsIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHZvbGF0aWxlIGludD4gPjo6dmFsdWUpKTsKKworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxub19yZXN1bHRfdHlwZV9vcl9yZXN1bHRfdGVtcGxhdGU8dm9pZD4oZG91YmxlKT46OnR5cGUsIHNob3J0Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazxjb25zdCBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8dm9sYXRpbGUgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgdm9sYXRpbGUgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGRvdWJsZSk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazxjb25zdCB2b2xhdGlsZSBzaG9ydD4gPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KHZvaWQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8Y29uc3Qgbm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KHZvaWQpPjo6dHlwZSwgY3Zfb3ZlcmxvYWRfY2hlY2s8Y29uc3QgaW50PiA+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjx2b2xhdGlsZSBub19yZXN1bHRfdHlwZV9vcl9yZXN1bHRfdGVtcGxhdGU8dm9pZD4odm9pZCk+Ojp0eXBlLCBjdl9vdmVybG9hZF9jaGVjazx2b2xhdGlsZSBpbnQ+ID46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGNvbnN0IHZvbGF0aWxlIG5vX3Jlc3VsdF90eXBlX29yX3Jlc3VsdF90ZW1wbGF0ZTx2b2lkPih2b2lkKT46OnR5cGUsIGN2X292ZXJsb2FkX2NoZWNrPGNvbnN0IHZvbGF0aWxlIGludD4gPjo6dmFsdWUpKTsKKworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxmdW5jX3B0ciYoY2hhciwgZmxvYXQpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8ZnVuY19wdHIgY29uc3QmKGNoYXIsIGZsb2F0KT46OnR5cGUsIGludD46OnZhbHVlKSk7CisgIEJPT1NUX1NUQVRJQ19BU1NFUlQoKGlzX3NhbWU8cmVzdWx0X29mPGludF9yZXN1bHRfb2YmKGRvdWJsZSk+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxpbnRfcmVzdWx0X29mIGNvbnN0Jihkb3VibGUpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKworI2lmICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTKQorICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxub19yZXN1bHRfdHlwZV9vcl9yZXN1bHQoaW50JiYpPjo6dHlwZSwgc2hvcnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxub19yZXN1bHRfdHlwZV9vcl9yZXN1bHQoaW50Jik+Ojp0eXBlLCBpbnQ+Ojp2YWx1ZSkpOworICBCT09TVF9TVEFUSUNfQVNTRVJUKChpc19zYW1lPHJlc3VsdF9vZjxub19yZXN1bHRfdHlwZV9vcl9yZXN1bHQoaW50IGNvbnN0Jik+Ojp0eXBlLCBsb25nPjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGludCYmKT46OnR5cGUsIHNob3J0Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGludCYpPjo6dHlwZSwgaW50Pjo6dmFsdWUpKTsKKyAgQk9PU1RfU1RBVElDX0FTU0VSVCgoaXNfc2FtZTxyZXN1bHRfb2Y8bm9fcmVzdWx0X3R5cGVfb3JfcmVzdWx0X3RlbXBsYXRlPHZvaWQ+KGludCBjb25zdCYpPjo6dHlwZSwgbG9uZz46OnZhbHVlKSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFKSB8fCBkZWZpbmVkKEJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxX1dJVEhfREVDTFRZUEVfRkFMTEJBQ0spCisgIGludCBpID0gMTIzOworICBzZmluYWVfdGVzdChzZmluYWVfdGVzdF9mLCBpKTsKKyNlbmRpZiAvLyBkZWZpbmVkKEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUpIHx8IGRlZmluZWQoQk9PU1RfUkVTVUxUX09GX1VTRV9UUjFfV0lUSF9ERUNMVFlQRV9GQUxMQkFDSykKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3JlZl9mcm9tX3J2YWx1ZS5jcHAgYi90ZXN0L3N0cmluZ19yZWZfZnJvbV9ydmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzhhNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0cmluZ19yZWZfZnJvbV9ydmFsdWUuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgICBDb3B5cmlnaHQgKGMpIE1hcnNoYWxsIENsb3cgMjAxNy4KKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHA+CisKKyNpZiBkZWZpbmVkKEJPT1NUX05PX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTKSB8fCBkZWZpbmVkKEJPT1NUX05PX0NYWDExX0RFTEVURURfRlVOQ1RJT05TKQorI2Vycm9yICJVbnN1cHBvcnRlZCB0ZXN0IgorI2VuZGlmCisKK3N0ZDo6c3RyaW5nIG1ha2VhdGVtcCgpIHsgcmV0dXJuICJhYmMiOyB9CisKK2ludCBtYWluKCkKK3sKKyAgYm9vc3Q6OmJhc2ljX3N0cmluZ19yZWY8Y2hhcj4gc3YobWFrZWF0ZW1wKCkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3JlZl90ZXN0MS5jcHAgYi90ZXN0L3N0cmluZ19yZWZfdGVzdDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODg5MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0cmluZ19yZWZfdGVzdDEuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICAgQ29weXJpZ2h0IChjKSBNYXJzaGFsbCBDbG93IDIwMTItMjAxMi4KKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jb3JlL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgorCit0eXBlZGVmIGJvb3N0OjpzdHJpbmdfcmVmIHN0cmluZ19yZWY7CisKKy8vICBTaG91bGQgYmUgZXF1YWwKK3ZvaWQgaW50ZXJvcCAoIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHN0cmluZ19yZWYgcmVmICkgeworLy8gIEJPT1NUX1RFU1QgKCBzdHIgPT0gcmVmICk7CisgICAgQk9PU1RfVEVTVCAoIHN0ci5zaXplICgpID09IHJlZi5zaXplICgpKTsKKyAgICBCT09TVF9URVNUICggc3RkOjplcXVhbCAoIHN0ci5iZWdpbiAoKSwgIHN0ci5lbmQgKCksICByZWYuYmVnaW4gKCkpKTsKKyAgICBCT09TVF9URVNUICggc3RkOjplcXVhbCAoIHN0ci5yYmVnaW4gKCksIHN0ci5yZW5kICgpLCByZWYucmJlZ2luICgpKSk7CisgICAgfQorCit2b2lkIG51bGxfdGVzdHMgKCBjb25zdCBjaGFyICpwICkgeworLy8gIEFsbCB6ZXJvLWxlbmd0aCBzdHJpbmctcmVmcyBzaG91bGQgYmUgZXF1YWwKKyAgICBzdHJpbmdfcmVmIHNyMTsgLy8gTlVMTCwgMAorICAgIHN0cmluZ19yZWYgc3IyICggTlVMTCwgMCApOworICAgIHN0cmluZ19yZWYgc3IzICggcCwgMCApOworICAgIHN0cmluZ19yZWYgc3I0ICggcCApOworICAgIHNyNC5jbGVhciAoKTsKKworICAgIEJPT1NUX1RFU1QgKCBzcjEgPT0gc3IyICk7CisgICAgQk9PU1RfVEVTVCAoIHNyMSA9PSBzcjMgKTsKKyAgICBCT09TVF9URVNUICggc3IyID09IHNyMyApOworICAgIEJPT1NUX1RFU1QgKCBzcjEgPT0gc3I0ICk7CisgICAgfQorCisvLyAgbWFrZSBzdXJlIHRoYXQgc3Vic3RyaW5ncyB3b3JrIGp1c3QgbGlrZSBzdHJpbmdzCit2b2lkIHRlc3Rfc3Vic3RyICggY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciApIHsKKyAgICBjb25zdCBzaXplX3Qgc3ogPSBzdHIuc2l6ZSAoKTsKKyAgICBzdHJpbmdfcmVmIHJlZiAoIHN0ciApOworCisvLyAgU3Vic3RyaW5ncyBhdCB0aGUgZW5kCisgICAgZm9yICggc2l6ZV90IGkgPSAwOyBpIDw9IHN6OyArKyBpICkKKyAgICAgICAgaW50ZXJvcCAoIHN0ci5zdWJzdHIgKCBpICksIHJlZi5zdWJzdHIgKCBpICkpOworCisvLyAgU3Vic3RyaW5ncyBhdCB0aGUgYmVnaW5uaW5nCisgICAgZm9yICggc2l6ZV90IGkgPSAwOyBpIDw9IHN6OyArKyBpICkKKyAgICAgICAgaW50ZXJvcCAoIHN0ci5zdWJzdHIgKCAwLCBpICksIHJlZi5zdWJzdHIgKCAwLCBpICkpOworCisvLyAgQWxsIHBvc3NpYmxlIHN1YnN0cmluZ3MKKyAgICBmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBzejsgKytpICkKKyAgICAgICAgZm9yICggc2l6ZV90IGogPSBpOyBqIDwgc3o7ICsraiApCisgICAgICAgICAgICBpbnRlcm9wICggc3RyLnN1YnN0ciAoIGksIGogKSwgcmVmLnN1YnN0ciAoIGksIGogKSk7CisgICAgfQorCisvLyAgbWFrZSBzdXJlIHRoYXQgcmVtb3ZpbmcgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHdvcmsganVzdCBsaWtlIHN0cmluZ3MKK3ZvaWQgdGVzdF9yZW1vdmUgKCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ci5zaXplICgpOworICAgIHN0ZDo6c3RyaW5nIHdvcms7CisgICAgc3RyaW5nX3JlZiByZWY7CisKKyAgICBmb3IgKCBzaXplX3QgaSA9IDE7IGkgPD0gc3o7ICsraSApIHsKKyAgICAgIHdvcmsgPSBzdHI7CisgICAgICByZWYgID0gc3RyOworICAgICAgd2hpbGUgKCByZWYuc2l6ZSAoKSA+PSBpICkgeworICAgICAgICAgIGludGVyb3AgKCB3b3JrLCByZWYgKTsKKyAgICAgICAgICB3b3JrLmVyYXNlICggMCwgaSApOworICAgICAgICAgIHJlZi5yZW1vdmVfcHJlZml4IChpKTsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICBmb3IgKCBzaXplX3QgaSA9IDE7IGkgPCBzejsgKysgaSApIHsKKyAgICAgIHdvcmsgPSBzdHI7CisgICAgICByZWYgID0gc3RyOworICAgICAgd2hpbGUgKCByZWYuc2l6ZSAoKSA+PSBpICkgeworICAgICAgICAgIGludGVyb3AgKCB3b3JrLCByZWYgKTsKKyAgICAgICAgICB3b3JrLmVyYXNlICggd29yay5zaXplICgpIC0gaSwgaSApOworICAgICAgICAgIHJlZi5yZW1vdmVfc3VmZml4IChpKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorCitjb25zdCBjaGFyICp0ZXN0X3N0cmluZ3MgW10gPSB7CisgICAgIiIsCisgICAgIjEiLAorICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCisgICAgIjAxMjM0NTY3ODkiLAorICAgIE5VTEwKKyAgICB9OworCitpbnQgbWFpbigpCit7CisgICAgY29uc3QgY2hhciAqKnAgPSAmdGVzdF9zdHJpbmdzWzBdOworCisgICAgd2hpbGUgKCAqcCAhPSBOVUxMICkgeworICAgICAgICBpbnRlcm9wICggKnAsICpwICk7CisgICAgICAgIHRlc3Rfc3Vic3RyICggKnAgKTsKKyAgICAgICAgdGVzdF9yZW1vdmUgKCAqcCApOworICAgICAgICBudWxsX3Rlc3RzICggKnAgKTsKKworICAgICAgICBwKys7CisgICAgICAgIH0KKworICAgIHJldHVybiBib29zdDo6cmVwb3J0X2Vycm9ycygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9zdHJpbmdfcmVmX3Rlc3QyLmNwcCBiL3Rlc3Qvc3RyaW5nX3JlZl90ZXN0Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiNWQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RyaW5nX3JlZl90ZXN0Mi5jcHAKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgICBDb3B5cmlnaHQgKGMpIE1hcnNoYWxsIENsb3cgMjAxMi0yMDEyLgorCisgICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisgICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKworICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaHR0cDovL3d3dy5ib29zdC5vcmcKKyovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RyaW5nPiAgICAvLyBmb3Igc3RkOjpzdHJjaHIKKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHA+CisKKyNpbmNsdWRlIDxib29zdC9jb3JlL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgorCit0eXBlZGVmIGJvb3N0OjpzdHJpbmdfcmVmIHN0cmluZ19yZWY7CisKK3ZvaWQgZW5kc193aXRoICggY29uc3QgY2hhciAqYXJnICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ZDo6c3RybGVuICggYXJnICk7CisgICAgc3RyaW5nX3JlZiBzciAoIGFyZyApOworICAgIHN0cmluZ19yZWYgc3IyICggYXJnICk7CisgICAgY29uc3QgY2hhciAqcCA9IGFyZzsKKworICAgIHdoaWxlICggKnAgKSB7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzci5lbmRzX3dpdGggKCBwICkpOworICAgICAgICArK3A7CisgICAgICAgIH0KKworICAgIHdoaWxlICggIXNyMi5lbXB0eSAoKSkgeworICAgICAgICBCT09TVF9URVNUICggc3IuZW5kc193aXRoICggc3IyICkpOworICAgICAgICBzcjIucmVtb3ZlX3ByZWZpeCAoMSk7CisgICAgICAgIH0KKworICAgIHNyMiA9IGFyZzsKKyAgICB3aGlsZSAoICFzcjIuZW1wdHkgKCkpIHsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyLmVuZHNfd2l0aCAoIHNyMiApKTsKKyAgICAgICAgc3IyLnJlbW92ZV9wcmVmaXggKDEpOworICAgICAgICB9CisKKyAgICBjaGFyIGNoID0gc3ogPT0gMCA/ICdcMCcgOiBhcmcgWyBzeiAtIDEgXTsKKyAgICBzcjIgPSBhcmc7CisgICAgaWYgKCBzeiA+IDAgKQorICAgICAgQk9PU1RfVEVTVCAoIHNyMi5lbmRzX3dpdGggKCBjaCApKTsKKyAgICBCT09TVF9URVNUICggIXNyMi5lbmRzX3dpdGggKCArK2NoICkpOworICAgIEJPT1NUX1RFU1QgKCBzcjIuZW5kc193aXRoICggc3RyaW5nX3JlZiAoKSkpOworICAgIH0KKwordm9pZCBzdGFydHNfd2l0aCAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKyAgICBjb25zdCBzaXplX3Qgc3ogPSBzdGQ6OnN0cmxlbiAoIGFyZyApOworICAgIHN0cmluZ19yZWYgc3IgICggYXJnICk7CisgICAgc3RyaW5nX3JlZiBzcjIgKCBhcmcgKTsKKyAgICBjb25zdCBjaGFyICpwID0gYXJnICsgc3RkOjpzdHJsZW4gKCBhcmcgKSAtIDE7CisgICAgd2hpbGUgKCBwID49IGFyZyApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZm9vICggYXJnLCBwICsgMSApOworICAgICAgICBCT09TVF9URVNUICggc3Iuc3RhcnRzX3dpdGggKCBmb28gKSk7CisgICAgICAgIC0tcDsKKyAgICAgICAgfQorCisgICAgd2hpbGUgKCAhc3IyLmVtcHR5ICgpKSB7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzci5zdGFydHNfd2l0aCAoIHNyMiApKTsKKyAgICAgICAgc3IyLnJlbW92ZV9zdWZmaXggKDEpOworICAgICAgICB9CisKKyAgICBjaGFyIGNoID0gKmFyZzsKKyAgICBzcjIgPSBhcmc7CisgIGlmICggc3ogPiAwICkKKyAgICBCT09TVF9URVNUICggc3IyLnN0YXJ0c193aXRoICggY2ggKSk7CisgICAgQk9PU1RfVEVTVCAoICFzcjIuc3RhcnRzX3dpdGggKCArK2NoICkpOworICAgIEJPT1NUX1RFU1QgKCBzcjIuc3RhcnRzX3dpdGggKCBzdHJpbmdfcmVmICgpKSk7CisgICAgfQorCit2b2lkIHJldmVyc2UgKCBjb25zdCBjaGFyICphcmcgKSB7CisvLyAgUm91bmQgdHJpcAorICAgIHN0cmluZ19yZWYgc3IxICggYXJnICk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nMSAoIHNyMS5yYmVnaW4gKCksIHNyMS5yZW5kICgpKTsKKyAgICBzdHJpbmdfcmVmIHNyMiAoIHN0cmluZzEgKTsKKyAgICBzdGQ6OnN0cmluZyBzdHJpbmcyICggc3IyLnJiZWdpbiAoKSwgc3IyLnJlbmQgKCkpOworCisgICAgQk9PU1RfVEVTVCAoIHN0ZDo6ZXF1YWwgKCBzcjIucmJlZ2luICgpLCBzcjIucmVuZCAoKSwgYXJnICkpOworICAgIEJPT1NUX1RFU1QgKCBzdHJpbmcyID09IGFyZyApOworICAgIEJPT1NUX1RFU1QgKCBzdGQ6OmVxdWFsICggc3IxLmJlZ2luICgpLCBzcjEuZW5kICgpLCBzdHJpbmcyLmJlZ2luICgpKSk7CisgICAgfQorCisvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBlbGltaW5hdGVzIHNpZ25lZCB2cy4gdW5zaWduZWQgd2FybmluZ3MKK3N0cmluZ19yZWY6OnNpemVfdHlwZSBwdHJfZGlmZiAoIGNvbnN0IGNoYXIgKnJlcywgY29uc3QgY2hhciAqYmFzZSApIHsKKyAgICBCT09TVF9URVNUICggcmVzID49IGJhc2UgKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RyaW5nX3JlZjo6c2l6ZV90eXBlPiAoIHJlcyAtIGJhc2UgKTsKKyAgICB9CisKK3ZvaWQgZmluZCAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKyAgICBzdHJpbmdfcmVmIHNyMTsKKyAgICBzdHJpbmdfcmVmIHNyMjsKKyAgICBjb25zdCBjaGFyICpwOworCisvLyAgTG9vayBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyhzZWFyY2hpbmcgZnJvbSB0aGUgc3RhcnQpCisgICAgcCA9IGFyZzsKKyAgICBzcjEgPSBhcmc7CisgICAgd2hpbGUgKCAqcCApIHsKKyAgICAgIHN0cmluZ19yZWY6OnNpemVfdHlwZSBwb3MgPSBzcjEuZmluZCgqcCk7CisgICAgICBCT09TVF9URVNUICggcG9zICE9IHN0cmluZ19yZWY6Om5wb3MgJiYgKCBwb3MgPD0gcHRyX2RpZmYgKCBwLCBhcmcgKSkpOworICAgICAgKytwOworICAgICAgfQorCisvLyAgTG9vayBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyAoc2VhcmNoaW5nIGZyb20gdGhlIGVuZCkKKyAgICBwID0gYXJnOworICAgIHNyMSA9IGFyZzsKKyAgICB3aGlsZSAoICpwICkgeworICAgICAgc3RyaW5nX3JlZjo6c2l6ZV90eXBlIHBvcyA9IHNyMS5yZmluZCgqcCk7CisgICAgICBCT09TVF9URVNUICggcG9zICE9IHN0cmluZ19yZWY6Om5wb3MgJiYgcG9zIDwgc3IxLnNpemUgKCkgJiYgKCBwb3MgPj0gcHRyX2RpZmYgKCBwLCBhcmcgKSkpOworICAgICAgKytwOworICAgICAgfQorCisvLyBMb29rIGZvciBwYWlycyBvbiBjaGFyYWN0ZXJzIChzZWFyY2hpbmcgZnJvbSB0aGUgc3RhcnQpCisgICAgc3IxID0gYXJnOworICAgIHAgPSBhcmc7CisgICAgd2hpbGUgKCAqcCAmJiAqKHArMSkpIHsKKyAgICAgICAgc3RyaW5nX3JlZiBzcjMgKCBwLCAyICk7CisgICAgICAgIHN0cmluZ19yZWY6OnNpemVfdHlwZSBwb3MgPSBzcjEuZmluZCAoIHNyMyApOworICAgICAgICBCT09TVF9URVNUICggcG9zICE9IHN0cmluZ19yZWY6Om5wb3MgJiYgcG9zIDw9IHN0YXRpY19jYXN0PHN0cmluZ19yZWY6OnNpemVfdHlwZT4oIHAgLSBhcmcgKSk7CisgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgc3IxID0gYXJnOworICAgIHAgPSBhcmc7CisvLyAgZm9yIGFsbCBwb3NzaWJsZSBjaGFycywgc2VlIGlmIHdlIGZpbmQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuCisvLyAgTm90ZSB0aGF0IHN0cmNociB3aWxsL21pZ2h0IGRvIHRoZSBfd3JvbmdfIHRoaW5nIGlmIHdlIHNlYXJjaCBmb3IgTlVMTAorICAgIGZvciAoIGludCBjaCA9IDE7IGNoIDwgMjU2OyArK2NoICkgeworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmQoY2gpOworICAgICAgICBjb25zdCBjaGFyICpzdHJwID0gc3RkOjpzdHJjaHIgKCBhcmcsIGNoICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCggc3RycCA9PSBOVUxMICkgPT0gKCBwb3MgPT0gc3RyaW5nX3JlZjo6bnBvcyApKTsKKyAgICAgICAgaWYgKCBzdHJwICE9IE5VTEwgKQorICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHB0cl9kaWZmICggc3RycCwgYXJnICkgPT0gcG9zICk7CisgICAgfQorCisgICAgc3IxID0gYXJnOworICAgIHAgPSBhcmc7CisvLyAgZm9yIGFsbCBwb3NzaWJsZSBjaGFycywgc2VlIGlmIHdlIGZpbmQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuCisvLyAgTm90ZSB0aGF0IHN0cmNociB3aWxsL21pZ2h0IGRvIHRoZSBfd3JvbmdfIHRoaW5nIGlmIHdlIHNlYXJjaCBmb3IgTlVMTAorICAgIGZvciAoIGludCBjaCA9IDE7IGNoIDwgMjU2OyArK2NoICkgeworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zID0gc3IxLnJmaW5kKGNoKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RycCA9IHN0ZDo6c3RycmNociAoIGFyZywgY2ggKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoKCBzdHJwID09IE5VTEwgKSA9PSAoIHBvcyA9PSBzdHJpbmdfcmVmOjpucG9zICkpOworICAgICAgICBpZiAoIHN0cnAgIT0gTlVMTCApCisgICAgICAgICAgICBCT09TVF9URVNUICggcHRyX2RpZmYgKCBzdHJwLCBhcmcgKSA9PSBwb3MgKTsKKyAgICB9CisKKworLy8gIEZpbmQgZXZlcnl0aGluZyBhdCB0aGUgc3RhcnQKKyAgICBwID0gYXJnOworICAgIHNyMSA9IGFyZzsKKyAgICB3aGlsZSAoICFzcjEuZW1wdHkgKCkpIHsKKyAgICAgICAgc3RyaW5nX3JlZjo6c2l6ZV90eXBlIHBvcyA9IHNyMS5maW5kKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvcyA9PSAwICk7CisgICAgICAgIHNyMS5yZW1vdmVfcHJlZml4ICgxKTsKKyAgICAgICAgKytwOworICAgICAgICB9CisKKy8vICBGaW5kIGV2ZXJ5dGhpbmcgYXQgdGhlIGVuZAorICAgIHNyMSAgPSBhcmc7CisgICAgcCAgICA9IGFyZyArIHN0ZDo6c3RybGVuICggYXJnICkgLSAxOworICAgIHdoaWxlICggIXNyMS5lbXB0eSAoKSkgeworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zID0gc3IxLnJmaW5kKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvcyA9PSBzcjEuc2l6ZSAoKSAtIDEgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9zdWZmaXggKDEpOworICAgICAgICAtLXA7CisgICAgICAgIH0KKworLy8gIEZpbmQgZXZlcnl0aGluZyBhdCB0aGUgc3RhcnQKKyAgICBzcjEgID0gYXJnOworICAgIHAgICAgPSBhcmc7CisgICAgd2hpbGUgKCAhc3IxLmVtcHR5ICgpKSB7CisgICAgICAgIHN0cmluZ19yZWY6OnNpemVfdHlwZSBwb3MgPSBzcjEuZmluZF9maXJzdF9vZigqcCk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MgPT0gMCApOworICAgICAgICBzcjEucmVtb3ZlX3ByZWZpeCAoMSk7CisgICAgICAgICsrcDsKKyAgICAgICAgfQorCisKKy8vICBGaW5kIGV2ZXJ5dGhpbmcgYXQgdGhlIGVuZAorICAgIHNyMSAgPSBhcmc7CisgICAgcCAgICA9IGFyZyArIHN0ZDo6c3RybGVuICggYXJnICkgLSAxOworICAgIHdoaWxlICggIXNyMS5lbXB0eSAoKSkgeworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmRfbGFzdF9vZigqcCk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MgPT0gc3IxLnNpemUgKCkgLSAxICk7CisgICAgICAgIHNyMS5yZW1vdmVfc3VmZml4ICgxKTsKKyAgICAgICAgLS1wOworICAgICAgICB9CisKKy8vICBCYXNpYyBzYW5pdHkgY2hlY2tpbmcgZm9yICJmaW5kX2ZpcnN0X29mIC8gZmluZF9maXJzdF9ub3Rfb2YiCisgICAgc3IxID0gYXJnOworICAgIHNyMiA9IGFyZzsKKyAgICB3aGlsZSAoICFzcjEuZW1wdHkoKSApIHsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyMS5maW5kX2ZpcnN0X29mICggc3IyICkgICAgID09IDAgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyMS5maW5kX2ZpcnN0X25vdF9vZiAoIHNyMiApID09IHN0cmluZ19yZWY6Om5wb3MgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9wcmVmaXggKCAxICk7CisgICAgICAgIH0KKworICAgIHAgPSBhcmc7CisgICAgc3IxID0gYXJnOworICAgIHdoaWxlICggKnAgKSB7CisgICAgICAgIHN0cmluZ19yZWY6OnNpemVfdHlwZSBwb3MxID0gc3IxLmZpbmRfZmlyc3Rfb2YoKnApOworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zMiA9IHNyMS5maW5kX2ZpcnN0X25vdF9vZigqcCk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MxICE9IHN0cmluZ19yZWY6Om5wb3MgJiYgcG9zMSA8IHNyMS5zaXplICgpICYmIHBvczEgPD0gcHRyX2RpZmYgKCBwLCBhcmcgKSk7CisgICAgICAgIGlmICggcG9zMiAhPSBzdHJpbmdfcmVmOjpucG9zICkgeworICAgICAgICAgICAgZm9yICggc2l6ZV90IGkgPSAwIDsgaSA8IHBvczI7ICsraSApCisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHNyMVtpXSA9PSAqcCApOworICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHNyMSBbIHBvczIgXSAhPSAqcCApOworICAgICAgICAgICAgfQorCisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MyICE9IHBvczEgKTsKKyAgICAgICAgKytwOworICAgICAgICB9CisKKy8vICBCYXNpYyBzYW5pdHkgY2hlY2tpbmcgZm9yICJmaW5kX2xhc3Rfb2YgLyBmaW5kX2xhc3Rfbm90X29mIgorICAgIHNyMSA9IGFyZzsKKyAgICBzcjIgPSBhcmc7CisgICAgd2hpbGUgKCAhc3IxLmVtcHR5KCkgKSB7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEuZmluZF9sYXN0X29mICggc3IyICkgICAgID09ICggc3IxLnNpemUgKCkgLSAxICkpOworICAgICAgICBCT09TVF9URVNUICggc3IxLmZpbmRfbGFzdF9ub3Rfb2YgKCBzcjIgKSA9PSBzdHJpbmdfcmVmOjpucG9zICk7CisgICAgICAgIHNyMS5yZW1vdmVfc3VmZml4ICggMSApOworICAgICAgICB9CisKKyAgICBwID0gYXJnOworICAgIHNyMSA9IGFyZzsKKyAgICB3aGlsZSAoICpwICkgeworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zMSA9IHNyMS5maW5kX2xhc3Rfb2YoKnApOworICAgICAgICBzdHJpbmdfcmVmOjpzaXplX3R5cGUgcG9zMiA9IHNyMS5maW5kX2xhc3Rfbm90X29mKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvczEgIT0gc3RyaW5nX3JlZjo6bnBvcyAmJiBwb3MxIDwgc3IxLnNpemUgKCkgJiYgcG9zMSA+PSBwdHJfZGlmZiAoIHAsIGFyZyApKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvczIgPT0gc3RyaW5nX3JlZjo6bnBvcyB8fCBwb3MxIDwgc3IxLnNpemUgKCkpOworICAgICAgICBpZiAoIHBvczIgIT0gc3RyaW5nX3JlZjo6bnBvcyApIHsKKyAgICAgICAgICAgIGZvciAoIHNpemVfdCBpID0gc3IxLnNpemUgKCkgLTEgOyBpID4gcG9zMjsgLS1pICkKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUICggc3IxW2ldID09ICpwICk7CisgICAgICAgICAgICBCT09TVF9URVNUICggc3IxIFsgcG9zMiBdICE9ICpwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvczIgIT0gcG9zMSApOworICAgICAgICArK3A7CisgICAgICAgIH0KKworICAgIH0KKworCit2b2lkIHRvX3N0cmluZyAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKyAgICBzdHJpbmdfcmVmIHNyMTsKKyAgICBzdGQ6OnN0cmluZyBzdHIxOworICAgIHN0ZDo6c3RyaW5nIHN0cjI7CisKKyAgICBzdHIxLmFzc2lnbiAoIGFyZyApOworICAgIHNyMSA9IGFyZzsKKy8vIHN0cjIgPSBzcjEudG9fc3RyaW5nPHN0ZDo6YWxsb2NhdG9yPGNoYXI+ID4gKCk7CisgICAgc3RyMiA9IHNyMS50b19zdHJpbmcgKCk7CisgICAgQk9PU1RfVEVTVCAoIHN0cjEgPT0gc3RyMiApOworCisjaWZuZGVmIEJPT1NUX05PX0NYWDExX0VYUExJQ0lUX0NPTlZFUlNJT05fT1BFUkFUT1JTCisgICAgc3RkOjpzdHJpbmcgc3RyMyA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPiAoIHNyMSApOworICAgIEJPT1NUX1RFU1QgKCBzdHIxID09IHN0cjMgKTsKKyNlbmRpZgorICAgIH0KKwordm9pZCBjb21wYXJlICggY29uc3QgY2hhciAqYXJnICkgeworICAgIHN0cmluZ19yZWYgc3IxOworICAgIHN0ZDo6c3RyaW5nIHN0cjE7CisgICAgc3RkOjpzdHJpbmcgc3RyMiA9IHN0cjE7CisKKyAgICBzdHIxLmFzc2lnbiAoIGFyZyApOworICAgIHNyMSA9IGFyZzsKKyAgICBCT09TVF9URVNUICggc3IxICA9PSBzcjEpOyAgICAgLy8gY29tcGFyZSBzdHJpbmdfcmVmIGFuZCBzdHJpbmdfcmVmCisgICAgQk9PU1RfVEVTVCAoIHNyMSAgPT0gc3RyMSk7ICAgIC8vIGNvbXBhcmUgc3RyaW5nIGFuZCBzdHJpbmdfcmVmCisgICAgQk9PU1RfVEVTVCAoIHN0cjEgPT0gc3IxICk7ICAgIC8vIGNvbXBhcmUgc3RyaW5nX3JlZiBhbmQgc3RyaW5nCisgICAgQk9PU1RfVEVTVCAoIHNyMSAgPT0gYXJnICk7ICAgIC8vIGNvbXBhcmUgc3RyaW5nX3JlZiBhbmQgcG9pbnRlcgorICAgIEJPT1NUX1RFU1QgKCBhcmcgID09IHNyMSApOyAgICAvLyBjb21wYXJlIHBvaW50ZXIgYW5kIHN0cmluZ19yZWYKKworICAgIGlmICggc3IxLnNpemUgKCkgPiAwICkgeworICAgICAgICAoKnN0cjEucmJlZ2luKCkpKys7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgICE9IHN0cjEgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHN0cjEgIT0gc3IxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPCBzdHIxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPD0gc3RyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA+IHNyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA+PSBzcjEgKTsKKworICAgICAgICAoKnN0cjEucmJlZ2luKCkpIC09IDI7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgICE9IHN0cjEgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHN0cjEgIT0gc3IxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPiBzdHIxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPj0gc3RyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA8IHNyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA8PSBzcjEgKTsKKyAgICAgICAgfQorICAgIH0KKworY29uc3QgY2hhciAqdGVzdF9zdHJpbmdzIFtdID0geworICAgICIiLAorICAgICIwIiwKKyAgICAiYWJjIiwKKyAgICAiQUFBIiwgIC8vIGFsbCB0aGUgc2FtZQorICAgICJhZHNmYWRhZGlhZWY7YWxrZGc7YWxqdDtqIGFnbDtzanJsO3RqcztsZ2E7bHJldGo7c3JnW3czNDl1NTIwOWRzZmFkZmFzZGZhc2RmYWRzZiIsCisgICAgImFiY1wwYXNkZmFkc2Zhc2YiLAorICAgIE5VTEwKKyAgICB9OworCitpbnQgbWFpbigpCit7CisgICAgY29uc3QgY2hhciAqKnAgPSAmdGVzdF9zdHJpbmdzWzBdOworCisgICAgd2hpbGUgKCAqcCAhPSBOVUxMICkgeworICAgICAgICBzdGFydHNfd2l0aCAoICpwICk7CisgICAgICAgIGVuZHNfd2l0aCAoICpwICk7CisgICAgICAgIHJldmVyc2UgKCAqcCApOworICAgICAgICBmaW5kICggKnAgKTsKKyAgICAgICAgdG9fc3RyaW5nICggKnAgKTsKKyAgICAgICAgY29tcGFyZSAoICpwICk7CisKKyAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3JlZl90ZXN0X2lvLmNwcCBiL3Rlc3Qvc3RyaW5nX3JlZl90ZXN0X2lvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA5ZjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdHJpbmdfcmVmX3Rlc3RfaW8uY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogICAgICAgICAgICAgQ29weXJpZ2h0IEFuZHJleSBTZW1hc2hldiAyMDEzLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogICAgICAgICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisvKiEKKyAqIFxmaWxlICAgc3RyaW5nX3JlZl90ZXN0X2lvLmNwcAorICogXGF1dGhvciBBbmRyZXkgU2VtYXNoZXYKKyAqIFxkYXRlICAgMjYuMDUuMjAxMworICoKKyAqIFxicmllZiAgVGhpcyBoZWFkZXIgY29udGFpbnMgdGVzdHMgZm9yIHN0cmVhbSBvcGVyYXRpb25zIG9mIFxjIGJhc2ljX3N0cmluZ19yZWYuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3JlZi5ocHA+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKworLyogQ3VycmVudCBpbXBsZW1lbnRhdGlvbnMgc2VlbSB0byBiZSBtaXNzaW5nIGNvZGVjdnQgZmFjZXRzIHRvIGNvbnZlcnQgY2hhcnMgdG8gY2hhcjE2X3QgYW5kIGNoYXIzMl90IGV2ZW4gdGhvdWdoIHRoZSB0eXBlcyBhcmUgYXZhaWxhYmxlLgorKi8KKworc3RhdGljIGNvbnN0IGNoYXIqIHRlc3Rfc3RyaW5nc1tdID0KK3sKKyAgICAiYmVnaW4iLAorICAgICJhYmNkIiwKKyAgICAiZW5kIgorfTsKKworLy8hIFRoZSBjb250ZXh0IHdpdGggdGVzdCBkYXRhIGZvciBwYXJ0aWN1bGFyIGNoYXJhY3RlciB0eXBlCit0ZW1wbGF0ZTwgdHlwZW5hbWUgQ2hhclQgPgorc3RydWN0IGNvbnRleHQKK3sKKyAgICB0eXBlZGVmIENoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPCBjaGFyX3R5cGUgPiBzdHJpbmdfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmluZ3N0cmVhbTwgY2hhcl90eXBlID4gb3N0cmVhbV90eXBlOworCisgICAgc3RyaW5nX3R5cGUgYmVnaW4sIGFiY2QsIGVuZDsKKworICAgIGNvbnRleHQoKQorICAgIHsKKyAgICAgICAgYm9vc3Q6OnN0cmluZ19yZWYgc3RyID0gdGVzdF9zdHJpbmdzWzBdOworICAgICAgICBzdGQ6OmNvcHkoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGJlZ2luKSk7CisKKyAgICAgICAgc3RyID0gdGVzdF9zdHJpbmdzWzFdOworICAgICAgICBzdGQ6OmNvcHkoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGFiY2QpKTsKKworICAgICAgICBzdHIgPSB0ZXN0X3N0cmluZ3NbMl07CisgICAgICAgIHN0ZDo6Y29weShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoZW5kKSk7CisgICAgfQorfTsKKworLy8gVGVzdCByZWd1bGFyIG91dHB1dAordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3Rfc3RyaW5nX3JlZl9vdXRwdXQoKQoreworICAgIHR5cGVkZWYgQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyaW5nc3RyZWFtPCBjaGFyX3R5cGUgPiBvc3RyZWFtX3R5cGU7CisgICAgdHlwZWRlZiBib29zdDo6YmFzaWNfc3RyaW5nX3JlZjwgY2hhcl90eXBlID4gc3RyaW5nX3JlZl90eXBlOworCisgICAgY29udGV4dDwgY2hhcl90eXBlID4gY3R4OworCisgICAgb3N0cmVhbV90eXBlIHN0cm07CisgICAgc3RybSA8PCBzdHJpbmdfcmVmX3R5cGUoY3R4LmFiY2QpOworICAgIEJPT1NUX1RFU1Qoc3RybS5zdHIoKSA9PSBjdHguYWJjZCk7Cit9CisKKy8vIFRlc3Qgc3VwcG9ydCBmb3IgcGFkZGluZwordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3RfcGFkZGluZygpCit7CisgICAgdHlwZWRlZiBDaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJpbmdzdHJlYW08IGNoYXJfdHlwZSA+IG9zdHJlYW1fdHlwZTsKKyAgICB0eXBlZGVmIGJvb3N0OjpiYXNpY19zdHJpbmdfcmVmPCBjaGFyX3R5cGUgPiBzdHJpbmdfcmVmX3R5cGU7CisKKyAgICBjb250ZXh0PCBjaGFyX3R5cGUgPiBjdHg7CisKKyAgICAvLyBUZXN0IGZvciBwYWRkaW5nCisgICAgeworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9yZWY7CisgICAgICAgIHN0cm1fcmVmIDw8IGN0eC5iZWdpbiA8PCBzdGQ6OnNldHcoOCkgPDwgc3RyaW5nX3JlZl90eXBlKGN0eC5hYmNkKSA8PCBjdHguZW5kOworCisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX2NvcnJlY3Q7CisgICAgICAgIHN0cm1fY29ycmVjdCA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgZm9yIGxvbmcgcGFkZGluZworICAgIHsKKyAgICAgICAgb3N0cmVhbV90eXBlIHN0cm1fcmVmOworICAgICAgICBzdHJtX3JlZiA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXR3KDEwMCkgPDwgc3RyaW5nX3JlZl90eXBlKGN0eC5hYmNkKSA8PCBjdHguZW5kOworCisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX2NvcnJlY3Q7CisgICAgICAgIHN0cm1fY29ycmVjdCA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXR3KDEwMCkgPDwgY3R4LmFiY2QgPDwgY3R4LmVuZDsKKworICAgICAgICBCT09TVF9URVNUKHN0cm1fcmVmLnN0cigpID09IHN0cm1fY29ycmVjdC5zdHIoKSk7CisgICAgfQorCisgICAgLy8gVGVzdCB0aGF0IHNob3J0IHdpZHRoIGRvZXMgbm90IHRydW5jYXRlIHRoZSBzdHJpbmcKKyAgICB7CisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX3JlZjsKKyAgICAgICAgc3RybV9yZWYgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0dygxKSA8PCBzdHJpbmdfcmVmX3R5cGUoY3R4LmFiY2QpIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgb3N0cmVhbV90eXBlIHN0cm1fY29ycmVjdDsKKyAgICAgICAgc3RybV9jb3JyZWN0IDw8IGN0eC5iZWdpbiA8PCBzdGQ6OnNldHcoMSkgPDwgY3R4LmFiY2QgPDwgY3R4LmVuZDsKKworICAgICAgICBCT09TVF9URVNUKHN0cm1fcmVmLnN0cigpID09IHN0cm1fY29ycmVjdC5zdHIoKSk7CisgICAgfQorfQorCisvLyBUZXN0IHN1cHBvcnQgZm9yIHBhZGRpbmcgZmlsbAordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3RfcGFkZGluZ19maWxsKCkKK3sKKyAgICB0eXBlZGVmIENoYXJUIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfb3N0cmluZ3N0cmVhbTwgY2hhcl90eXBlID4gb3N0cmVhbV90eXBlOworICAgIHR5cGVkZWYgYm9vc3Q6OmJhc2ljX3N0cmluZ19yZWY8IGNoYXJfdHlwZSA+IHN0cmluZ19yZWZfdHlwZTsKKworICAgIGNvbnRleHQ8IGNoYXJfdHlwZSA+IGN0eDsKKworICAgIG9zdHJlYW1fdHlwZSBzdHJtX3JlZjsKKyAgICBzdHJtX3JlZiA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXRmaWxsKHN0YXRpY19jYXN0PCBjaGFyX3R5cGUgPigneCcpKSA8PCBzdGQ6OnNldHcoOCkgPDwgc3RyaW5nX3JlZl90eXBlKGN0eC5hYmNkKSA8PCBjdHguZW5kOworCisgICAgb3N0cmVhbV90eXBlIHN0cm1fY29ycmVjdDsKKyAgICBzdHJtX2NvcnJlY3QgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0ZmlsbChzdGF0aWNfY2FzdDwgY2hhcl90eXBlID4oJ3gnKSkgPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICBCT09TVF9URVNUKHN0cm1fcmVmLnN0cigpID09IHN0cm1fY29ycmVjdC5zdHIoKSk7Cit9CisKKy8vIFRlc3Qgc3VwcG9ydCBmb3IgYWxpZ25tZW50Cit0ZW1wbGF0ZTxjbGFzcyBDaGFyVD4KK3ZvaWQgdGVzdF9hbGlnbm1lbnQoKQoreworICAgIHR5cGVkZWYgQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyaW5nc3RyZWFtPCBjaGFyX3R5cGUgPiBvc3RyZWFtX3R5cGU7CisgICAgdHlwZWRlZiBib29zdDo6YmFzaWNfc3RyaW5nX3JlZjwgY2hhcl90eXBlID4gc3RyaW5nX3JlZl90eXBlOworCisgICAgY29udGV4dDwgY2hhcl90eXBlID4gY3R4OworCisgICAgLy8gTGVmdCBhbGlnbm1lbnQKKyAgICB7CisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX3JlZjsKKyAgICAgICAgc3RybV9yZWYgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoOCkgPDwgc3RyaW5nX3JlZl90eXBlKGN0eC5hYmNkKSA8PCBjdHguZW5kOworCisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX2NvcnJlY3Q7CisgICAgICAgIHN0cm1fY29ycmVjdCA8PCBjdHguYmVnaW4gPDwgc3RkOjpsZWZ0IDw8IHN0ZDo6c2V0dyg4KSA8PCBjdHguYWJjZCA8PCBjdHguZW5kOworCisgICAgICAgIEJPT1NUX1RFU1Qoc3RybV9yZWYuc3RyKCkgPT0gc3RybV9jb3JyZWN0LnN0cigpKTsKKyAgICB9CisKKyAgICAvLyBSaWdodCBhbGlnbm1lbnQKKyAgICB7CisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX3JlZjsKKyAgICAgICAgc3RybV9yZWYgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KDgpIDw8IHN0cmluZ19yZWZfdHlwZShjdHguYWJjZCkgPDwgY3R4LmVuZDsKKworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9jb3JyZWN0OworICAgICAgICBzdHJtX2NvcnJlY3QgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3QoKQoreworICAgIHRlc3Rfc3RyaW5nX3JlZl9vdXRwdXQ8Q2hhclQ+KCk7CisgICAgdGVzdF9wYWRkaW5nPENoYXJUPigpOworICAgIHRlc3RfcGFkZGluZ19maWxsPENoYXJUPigpOworICAgIHRlc3RfYWxpZ25tZW50PENoYXJUPigpOworfQorCitpbnQgbWFpbigpCit7CisgICAgdGVzdDxjaGFyPigpOworICAgIHRlc3Q8d2NoYXJfdD4oKTsKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3ZpZXdfY29uc3RleHByX3Rlc3QxLmNwcCBiL3Rlc3Qvc3RyaW5nX3ZpZXdfY29uc3RleHByX3Rlc3QxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTVkNjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9zdHJpbmdfdmlld19jb25zdGV4cHJfdGVzdDEuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICAgQ29weXJpZ2h0IChjKSBNYXJzaGFsbCBDbG93IDIwMTctMjAxNy4KKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisqLworCisjaW5jbHVkZSA8bmV3PiAgICAgICAgLy8gZm9yIHBsYWNlbWVudCBuZXcKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkZGVmPiAgICAvLyBmb3IgTlVMTCwgc3RkOjpzaXplX3QsIHN0ZDo6cHRyZGlmZl90CisjaW5jbHVkZSA8Y3N0cmluZz4gICAgLy8gZm9yIHN0ZDo6c3RyY2hyIGFuZCBzdGQ6OnN0cmNtcAorI2luY2x1ZGUgPGNzdGRsaWI+ICAgIC8vIGZvciBzdGQ6Om1hbGxvYyBhbmQgc3RkOjpmcmVlCisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3ZpZXcuaHBwPgorCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorc3RydWN0IGNvbnN0ZXhwcl9jaGFyX3RyYWl0cworeworICAgIHR5cGVkZWYgY2hhcgkJICAgIGNoYXJfdHlwZTsKKyAgICB0eXBlZGVmIGludCAgIAkJCWludF90eXBlOworICAgIHR5cGVkZWYgc3RkOjpzdHJlYW1vZmYJb2ZmX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnN0cmVhbXBvcwlwb3NfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6bWJzdGF0ZV90CXN0YXRlX3R5cGU7CisKKyAgICBzdGF0aWMgdm9pZCBhc3NpZ24oY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikgbm9leGNlcHQgeyBjMSA9IGMyOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGVxKGNoYXJfdHlwZSBjMSwgY2hhcl90eXBlIGMyKSBub2V4Y2VwdCAgIHsgcmV0dXJuIGMxID09IGMyOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGx0KGNoYXJfdHlwZSBjMSwgY2hhcl90eXBlIGMyKSBub2V4Y2VwdCAgIHsgcmV0dXJuIGMxIDwgYzI7IH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50ICAgICAgICAgICAgICBjb21wYXJlKGNvbnN0IGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCAgICAgICAgICAgbGVuZ3RoKGNvbnN0IGNoYXJfdHlwZSogcykgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyX3R5cGUqIGZpbmQoY29uc3QgY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY29uc3QgY2hhcl90eXBlJiBhKSBub2V4Y2VwdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXJfdHlwZSogICAgICAgbW92ZShjaGFyX3R5cGUqIHMxLCBjb25zdCBjaGFyX3R5cGUqIHMyLCBzaXplX3Qgbikgbm9leGNlcHQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyX3R5cGUqICAgICAgIGNvcHkoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pIG5vZXhjZXB0OworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhcl90eXBlKiAgICAgICBhc3NpZ24oY2hhcl90eXBlKiBzLCBzaXplX3QgbiwgY2hhcl90eXBlIGEpIG5vZXhjZXB0OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnRfdHlwZSAgbm90X2VvZihpbnRfdHlwZSBjKSBub2V4Y2VwdCB7IHJldHVybiBlcV9pbnRfdHlwZShjLCBlb2YoKSkgPyB+ZW9mKCkgOiBjOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyX3R5cGUgdG9fY2hhcl90eXBlKGludF90eXBlIGMpIG5vZXhjZXB0ICAgICAgICAgICAgICB7IHJldHVybiBjaGFyX3R5cGUoYyk7IH0KKyAgICBzdGF0aWMgY29uc3RleHByIGludF90eXBlICB0b19pbnRfdHlwZShjaGFyX3R5cGUgYykgbm9leGNlcHQgICAgICAgICAgICAgIHsgcmV0dXJuIGludF90eXBlKGMpOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sICAgICAgZXFfaW50X3R5cGUoaW50X3R5cGUgYzEsIGludF90eXBlIGMyKSBub2V4Y2VwdCB7IHJldHVybiBjMSA9PSBjMjsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50X3R5cGUgIGVvZigpIG5vZXhjZXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gRU9GOyB9Cit9OworCisvLwl5aWVsZHM6CisvLwkJMCBpZiBmb3IgZWFjaCBpIGluIFswLG4pLCBYOjplcShzMVtpXSxzMltpXSkgaXMgdHJ1ZTsgCisvLwkJZWxzZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpZiwgZm9yIHNvbWUgaiBpbiBbMCxuKSwgWDo6bHQoczFbal0sczJbal0pIGlzIHRydWUgYW5kCisvLwkJCWZvciBlYWNoIGkgaW4gWzAsaikgWDo6ZXEoczJbaV0sczJbaV0pIGlzIHRydWU7CisvLwkJZWxzZSBhIHBvc2l0aXZlIHZhbHVlLgorY29uc3RleHByIGludCBjb25zdGV4cHJfY2hhcl90cmFpdHM6OmNvbXBhcmUoY29uc3QgY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pIG5vZXhjZXB0Cit7CisgICAgZm9yICg7IG4gIT0gMDsgLS1uLCArK3MxLCArK3MyKQorICAgIHsKKyAgICAgICAgaWYgKGx0KCpzMSwgKnMyKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGx0KCpzMiwgKnMxKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8JeWllbGRzOiB0aGUgc21hbGxlc3QgaSBzdWNoIHRoYXQgWDo6ZXEoc1tpXSxjaGFyVCgpKSBpcyB0cnVlLgorY29uc3RleHByIHNpemVfdCBjb25zdGV4cHJfY2hhcl90cmFpdHM6Omxlbmd0aChjb25zdCBjaGFyX3R5cGUqIHMpIG5vZXhjZXB0Cit7CisgICAgc2l6ZV90IGxlbiA9IDA7CisgICAgZm9yICg7ICFlcSgqcywgY2hhcl90eXBlKDApKTsgKytzKQorICAgICAgICArK2xlbjsKKyAgICByZXR1cm4gbGVuOworfQorCit0eXBlZGVmIGJvb3N0OjpiYXNpY19zdHJpbmdfdmlldzxjaGFyLCBjb25zdGV4cHJfY2hhcl90cmFpdHM+IHN0cmluZ192aWV3OworCitpbnQgbWFpbigpCit7CisgICAgY29uc3RleHByIHN0cmluZ192aWV3IHN2MTsKKyAgICBjb25zdGV4cHIgc3RyaW5nX3ZpZXcgc3YyeyJhYmMiLCAzfTsgLy8gcHRyLCBsZW4KKyAgICBjb25zdGV4cHIgc3RyaW5nX3ZpZXcgc3YzeyJkZWYifTsgCSAvLyBwdHIKKworCWNvbnN0ZXhwciBjb25zdCBjaGFyICpzMSA9ICIiOworCWNvbnN0ZXhwciBjb25zdCBjaGFyICpzMiA9ICJhYmMiOworCQorCXN0YXRpY19hc3NlcnQoIChzdjEgPT0gc3YxKSwgIiIgKTsKKwkKKwlzdGF0aWNfYXNzZXJ0KCEoc3YxID09IHN2MiksICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIChzdjEgIT0gc3YyKSwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCggKHN2MSA8ICBzdjIpLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCAoc3YxIDw9IHN2MiksICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIShzdjEgPiAgc3YyKSwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCghKHN2MSA+PSBzdjIpLCAiIiApOyAgICAKKworCXN0YXRpY19hc3NlcnQoIShzMSA9PSBzdjIpLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCAoczEgIT0gc3YyKSwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCggKHMxIDwgIHN2MiksICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIChzMSA8PSBzdjIpLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCEoczEgPiAgc3YyKSwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCghKHMxID49IHN2MiksICIiICk7ICAgIAorCisJc3RhdGljX2Fzc2VydCghKHN2MSA9PSBzMiksICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIChzdjEgIT0gczIpLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCAoc3YxIDwgIHMyKSwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCggKHN2MSA8PSBzMiksICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIShzdjEgPiAgczIpLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCEoc3YxID49IHMyKSwgIiIgKTsgICAgCisKKwlzdGF0aWNfYXNzZXJ0KCBzdjEuY29tcGFyZShzdjIpICA8IDAsICIiICk7ICAgIAorCXN0YXRpY19hc3NlcnQoIHN2MS5jb21wYXJlKHN2MSkgPT0gMCwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCggc3YzLmNvbXBhcmUoc3YxKSAgPiAwLCAiIiApOyAgICAKKworCXN0YXRpY19hc3NlcnQoIHN2MS5jb21wYXJlKHMyKSAgPCAwLCAiIiApOyAgICAKKwlzdGF0aWNfYXNzZXJ0KCBzdjEuY29tcGFyZShzMSkgPT0gMCwgIiIgKTsgICAgCisJc3RhdGljX2Fzc2VydCggc3YzLmNvbXBhcmUoczEpICA+IDAsICIiICk7ICAgIAorfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZXN0L3N0cmluZ192aWV3X2Zyb21fcnZhbHVlLmNwcCBiL3Rlc3Qvc3RyaW5nX3ZpZXdfZnJvbV9ydmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjQ5MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0cmluZ192aWV3X2Zyb21fcnZhbHVlLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICAgQ29weXJpZ2h0IChjKSBNYXJzaGFsbCBDbG93IDIwMTcuCisKKyAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKKyAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorCisgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZworKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L3N0cmluZ192aWV3LmhwcD4KKworI2lmIGRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfUlZBTFVFX1JFRkVSRU5DRVMpIHx8IGRlZmluZWQoQk9PU1RfTk9fQ1hYMTFfREVMRVRFRF9GVU5DVElPTlMpCisjZXJyb3IgIlVuc3VwcG9ydGVkIHRlc3QiCisjZW5kaWYKKworc3RkOjpzdHJpbmcgbWFrZWF0ZW1wKCkgeyByZXR1cm4gImFiYyI7IH0KKworaW50IG1haW4oKQoreworICBib29zdDo6YmFzaWNfc3RyaW5nX3ZpZXc8Y2hhcj4gc3YobWFrZWF0ZW1wKCkpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3ZpZXdfdGVzdDEuY3BwIGIvdGVzdC9zdHJpbmdfdmlld190ZXN0MS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3MGE3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RyaW5nX3ZpZXdfdGVzdDEuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICAgQ29weXJpZ2h0IChjKSBNYXJzaGFsbCBDbG93IDIwMTItMjAxMi4KKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3ZpZXcuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKwordHlwZWRlZiBib29zdDo6c3RyaW5nX3ZpZXcgc3RyaW5nX3ZpZXc7CisKKy8vICBTaG91bGQgYmUgZXF1YWwKK3ZvaWQgaW50ZXJvcCAoIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHN0cmluZ192aWV3IHJlZiApIHsKKy8vICBCT09TVF9URVNUICggc3RyID09IHJlZiApOworICAgIEJPT1NUX1RFU1QgKCBzdHIuc2l6ZSAoKSA9PSByZWYuc2l6ZSAoKSk7CisgICAgQk9PU1RfVEVTVCAoIHN0ZDo6ZXF1YWwgKCBzdHIuYmVnaW4gKCksICBzdHIuZW5kICgpLCAgcmVmLmJlZ2luICgpKSk7CisgICAgQk9PU1RfVEVTVCAoIHN0ZDo6ZXF1YWwgKCBzdHIucmJlZ2luICgpLCBzdHIucmVuZCAoKSwgcmVmLnJiZWdpbiAoKSkpOworICAgIH0KKwordm9pZCBudWxsX3Rlc3RzICggY29uc3QgY2hhciAqcCApIHsKKy8vICBBbGwgemVyby1sZW5ndGggc3RyaW5nLXJlZnMgc2hvdWxkIGJlIGVxdWFsCisgICAgc3RyaW5nX3ZpZXcgc3IxOyAvLyBOVUxMLCAwCisgICAgc3RyaW5nX3ZpZXcgc3IyICggTlVMTCwgMCApOworICAgIHN0cmluZ192aWV3IHNyMyAoIHAsIDAgKTsKKyAgICBzdHJpbmdfdmlldyBzcjQgKCBwICk7CisgICAgc3I0LmNsZWFyICgpOworCisgICAgQk9PU1RfVEVTVCAoIHNyMSA9PSBzcjIgKTsKKyAgICBCT09TVF9URVNUICggc3IxID09IHNyMyApOworICAgIEJPT1NUX1RFU1QgKCBzcjIgPT0gc3IzICk7CisgICAgQk9PU1RfVEVTVCAoIHNyMSA9PSBzcjQgKTsKKyAgICB9CisKKy8vICBtYWtlIHN1cmUgdGhhdCBzdWJzdHJpbmdzIHdvcmsganVzdCBsaWtlIHN0cmluZ3MKK3ZvaWQgdGVzdF9zdWJzdHIgKCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ci5zaXplICgpOworICAgIHN0cmluZ192aWV3IHJlZiAoIHN0ciApOworCisvLyAgU3Vic3RyaW5ncyBhdCB0aGUgZW5kCisgICAgZm9yICggc2l6ZV90IGkgPSAwOyBpIDw9IHN6OyArKyBpICkKKyAgICAgICAgaW50ZXJvcCAoIHN0ci5zdWJzdHIgKCBpICksIHJlZi5zdWJzdHIgKCBpICkpOworCisvLyAgU3Vic3RyaW5ncyBhdCB0aGUgYmVnaW5uaW5nCisgICAgZm9yICggc2l6ZV90IGkgPSAwOyBpIDw9IHN6OyArKyBpICkKKyAgICAgICAgaW50ZXJvcCAoIHN0ci5zdWJzdHIgKCAwLCBpICksIHJlZi5zdWJzdHIgKCAwLCBpICkpOworCisvLyAgQWxsIHBvc3NpYmxlIHN1YnN0cmluZ3MKKyAgICBmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBzejsgKytpICkKKyAgICAgICAgZm9yICggc2l6ZV90IGogPSBpOyBqIDwgc3o7ICsraiApCisgICAgICAgICAgICBpbnRlcm9wICggc3RyLnN1YnN0ciAoIGksIGogKSwgcmVmLnN1YnN0ciAoIGksIGogKSk7CisgICAgfQorCisvLyAgbWFrZSBzdXJlIHRoYXQgcmVtb3ZpbmcgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHdvcmsganVzdCBsaWtlIHN0cmluZ3MKK3ZvaWQgdGVzdF9yZW1vdmUgKCBjb25zdCBzdGQ6OnN0cmluZyAmc3RyICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ci5zaXplICgpOworICAgIHN0ZDo6c3RyaW5nIHdvcms7CisgICAgc3RyaW5nX3ZpZXcgcmVmOworCisgICAgZm9yICggc2l6ZV90IGkgPSAxOyBpIDw9IHN6OyArK2kgKSB7CisgICAgICB3b3JrID0gc3RyOworICAgICAgcmVmICA9IHN0cjsKKyAgICAgIHdoaWxlICggcmVmLnNpemUgKCkgPj0gaSApIHsKKyAgICAgICAgICBpbnRlcm9wICggd29yaywgcmVmICk7CisgICAgICAgICAgd29yay5lcmFzZSAoIDAsIGkgKTsKKyAgICAgICAgICByZWYucmVtb3ZlX3ByZWZpeCAoaSk7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgZm9yICggc2l6ZV90IGkgPSAxOyBpIDwgc3o7ICsrIGkgKSB7CisgICAgICB3b3JrID0gc3RyOworICAgICAgcmVmICA9IHN0cjsKKyAgICAgIHdoaWxlICggcmVmLnNpemUgKCkgPj0gaSApIHsKKyAgICAgICAgICBpbnRlcm9wICggd29yaywgcmVmICk7CisgICAgICAgICAgd29yay5lcmFzZSAoIHdvcmsuc2l6ZSAoKSAtIGksIGkgKTsKKyAgICAgICAgICByZWYucmVtb3ZlX3N1ZmZpeCAoaSk7CisgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKworY29uc3QgY2hhciAqdGVzdF9zdHJpbmdzIFtdID0geworICAgICIiLAorICAgICIxIiwKKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLAorICAgICIwMTIzNDU2Nzg5IiwKKyAgICBOVUxMCisgICAgfTsKKworaW50IG1haW4oKQoreworICAgIGNvbnN0IGNoYXIgKipwID0gJnRlc3Rfc3RyaW5nc1swXTsKKworICAgIHdoaWxlICggKnAgIT0gTlVMTCApIHsKKyAgICAgICAgaW50ZXJvcCAoICpwLCAqcCApOworICAgICAgICB0ZXN0X3N1YnN0ciAoICpwICk7CisgICAgICAgIHRlc3RfcmVtb3ZlICggKnAgKTsKKyAgICAgICAgbnVsbF90ZXN0cyAoICpwICk7CisKKyAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3ZpZXdfdGVzdDIuY3BwIGIvdGVzdC9zdHJpbmdfdmlld190ZXN0Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0OWU2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qvc3RyaW5nX3ZpZXdfdGVzdDIuY3BwCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICAgQ29weXJpZ2h0IChjKSBNYXJzaGFsbCBDbG93IDIwMTItMjAxMi4KKworICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisKKyAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly93d3cuYm9vc3Qub3JnCisqLworCisjaW5jbHVkZSA8bmV3PiAgICAgICAgLy8gZm9yIHBsYWNlbWVudCBuZXcKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxjc3RkZGVmPiAgICAvLyBmb3IgTlVMTCwgc3RkOjpzaXplX3QsIHN0ZDo6cHRyZGlmZl90CisjaW5jbHVkZSA8Y3N0cmluZz4gICAgLy8gZm9yIHN0ZDo6c3RyY2hyIGFuZCBzdGQ6OnN0cmNtcAorI2luY2x1ZGUgPGNzdGRsaWI+ICAgIC8vIGZvciBzdGQ6Om1hbGxvYyBhbmQgc3RkOjpmcmVlCisKKyNpbmNsdWRlIDxib29zdC91dGlsaXR5L3N0cmluZ192aWV3LmhwcD4KKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY29yZS9saWdodHdlaWdodF90ZXN0LmhwcD4KKwordHlwZWRlZiBib29zdDo6c3RyaW5nX3ZpZXcgc3RyaW5nX3ZpZXc7CisKK3ZvaWQgZW5kc193aXRoICggY29uc3QgY2hhciAqYXJnICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ZDo6c3RybGVuICggYXJnICk7CisgICAgc3RyaW5nX3ZpZXcgc3IgKCBhcmcgKTsKKyAgICBzdHJpbmdfdmlldyBzcjIgKCBhcmcgKTsKKyAgICBjb25zdCBjaGFyICpwID0gYXJnOworCisgICAgd2hpbGUgKCAqcCApIHsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyLmVuZHNfd2l0aCAoIHAgKSk7CisgICAgICAgICsrcDsKKyAgICAgICAgfQorCisgICAgd2hpbGUgKCAhc3IyLmVtcHR5ICgpKSB7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzci5lbmRzX3dpdGggKCBzcjIgKSk7CisgICAgICAgIHNyMi5yZW1vdmVfcHJlZml4ICgxKTsKKyAgICAgICAgfQorCisgICAgc3IyID0gYXJnOworICAgIHdoaWxlICggIXNyMi5lbXB0eSAoKSkgeworICAgICAgICBCT09TVF9URVNUICggc3IuZW5kc193aXRoICggc3IyICkpOworICAgICAgICBzcjIucmVtb3ZlX3ByZWZpeCAoMSk7CisgICAgICAgIH0KKworICAgIGNoYXIgY2ggPSBzeiA9PSAwID8gJ1wwJyA6IGFyZyBbIHN6IC0gMSBdOworICAgIHNyMiA9IGFyZzsKKyAgICBpZiAoIHN6ID4gMCApCisgICAgICBCT09TVF9URVNUICggc3IyLmVuZHNfd2l0aCAoIGNoICkpOworICAgIEJPT1NUX1RFU1QgKCAhc3IyLmVuZHNfd2l0aCAoICsrY2ggKSk7CisgICAgQk9PU1RfVEVTVCAoIHNyMi5lbmRzX3dpdGggKCBzdHJpbmdfdmlldygpKSk7CisgICAgfQorCit2b2lkIHN0YXJ0c193aXRoICggY29uc3QgY2hhciAqYXJnICkgeworICAgIGNvbnN0IHNpemVfdCBzeiA9IHN0ZDo6c3RybGVuICggYXJnICk7CisgICAgc3RyaW5nX3ZpZXcgc3IgICggYXJnICk7CisgICAgc3RyaW5nX3ZpZXcgc3IyICggYXJnICk7CisgICAgY29uc3QgY2hhciAqcCA9IGFyZyArIHN0ZDo6c3RybGVuICggYXJnICkgLSAxOworICAgIHdoaWxlICggcCA+PSBhcmcgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZvbyAoIGFyZywgcCArIDEgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyLnN0YXJ0c193aXRoICggZm9vICkpOworICAgICAgICAtLXA7CisgICAgICAgIH0KKworICAgIHdoaWxlICggIXNyMi5lbXB0eSAoKSkgeworICAgICAgICBCT09TVF9URVNUICggc3Iuc3RhcnRzX3dpdGggKCBzcjIgKSk7CisgICAgICAgIHNyMi5yZW1vdmVfc3VmZml4ICgxKTsKKyAgICAgICAgfQorCisgICAgY2hhciBjaCA9ICphcmc7CisgICAgc3IyID0gYXJnOworICBpZiAoIHN6ID4gMCApCisgICAgQk9PU1RfVEVTVCAoIHNyMi5zdGFydHNfd2l0aCAoIGNoICkpOworICAgIEJPT1NUX1RFU1QgKCAhc3IyLnN0YXJ0c193aXRoICggKytjaCApKTsKKyAgICBCT09TVF9URVNUICggc3IyLnN0YXJ0c193aXRoICggc3RyaW5nX3ZpZXcgKCkpKTsKKyAgICB9CisKK3ZvaWQgcmV2ZXJzZSAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKy8vICBSb3VuZCB0cmlwCisgICAgc3RyaW5nX3ZpZXcgc3IxICggYXJnICk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nMSAoIHNyMS5yYmVnaW4gKCksIHNyMS5yZW5kICgpKTsKKyAgICBzdHJpbmdfdmlldyBzcjIgKCBzdHJpbmcxICk7CisgICAgc3RkOjpzdHJpbmcgc3RyaW5nMiAoIHNyMi5yYmVnaW4gKCksIHNyMi5yZW5kICgpKTsKKworICAgIEJPT1NUX1RFU1QgKCBzdGQ6OmVxdWFsICggc3IyLnJiZWdpbiAoKSwgc3IyLnJlbmQgKCksIGFyZyApKTsKKyAgICBCT09TVF9URVNUICggc3RyaW5nMiA9PSBhcmcgKTsKKyAgICBCT09TVF9URVNUICggc3RkOjplcXVhbCAoIHNyMS5iZWdpbiAoKSwgc3IxLmVuZCAoKSwgc3RyaW5nMi5iZWdpbiAoKSkpOworICAgIH0KKworLy8gIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGVsaW1pbmF0ZXMgc2lnbmVkIHZzLiB1bnNpZ25lZCB3YXJuaW5ncworc3RyaW5nX3ZpZXc6OnNpemVfdHlwZSBwdHJfZGlmZiAoIGNvbnN0IGNoYXIgKnJlcywgY29uc3QgY2hhciAqYmFzZSApIHsKKyAgICBCT09TVF9URVNUICggcmVzID49IGJhc2UgKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RyaW5nX3ZpZXc6OnNpemVfdHlwZT4gKCByZXMgLSBiYXNlICk7CisgICAgfQorCit2b2lkIGZpbmQgKCBjb25zdCBjaGFyICphcmcgKSB7CisgICAgc3RyaW5nX3ZpZXcgc3IxOworICAgIHN0cmluZ192aWV3IHNyMjsKKyAgICBjb25zdCBjaGFyICpwOworCisvLyAgTG9vayBmb3IgZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyhzZWFyY2hpbmcgZnJvbSB0aGUgc3RhcnQpCisgICAgcCA9IGFyZzsKKyAgICBzcjEgPSBhcmc7CisgICAgd2hpbGUgKCAqcCApIHsKKyAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmQoKnApOworICAgICAgQk9PU1RfVEVTVCAoIHBvcyAhPSBzdHJpbmdfdmlldzo6bnBvcyAmJiAoIHBvcyA8PSBwdHJfZGlmZiAoIHAsIGFyZyApKSk7CisgICAgICArK3A7CisgICAgICB9CisKKy8vICBMb29rIGZvciBlYWNoIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIChzZWFyY2hpbmcgZnJvbSB0aGUgZW5kKQorICAgIHAgPSBhcmc7CisgICAgc3IxID0gYXJnOworICAgIHdoaWxlICggKnAgKSB7CisgICAgICBzdHJpbmdfdmlldzo6c2l6ZV90eXBlIHBvcyA9IHNyMS5yZmluZCgqcCk7CisgICAgICBCT09TVF9URVNUICggcG9zICE9IHN0cmluZ192aWV3OjpucG9zICYmIHBvcyA8IHNyMS5zaXplICgpICYmICggcG9zID49IHB0cl9kaWZmICggcCwgYXJnICkpKTsKKyAgICAgICsrcDsKKyAgICAgIH0KKworLy8gIExvb2sgZm9yIHBhaXJzIG9uIGNoYXJhY3RlcnMgKHNlYXJjaGluZyBmcm9tIHRoZSBzdGFydCkKKyAgICBzcjEgPSBhcmc7CisgICAgcCA9IGFyZzsKKyAgICB3aGlsZSAoICpwICYmICoocCsxKSkgeworICAgICAgICBzdHJpbmdfdmlldyBzcjMgKCBwLCAyICk7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmQgKCBzcjMgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvcyAhPSBzdHJpbmdfdmlldzo6bnBvcyAmJiBwb3MgPD0gc3RhdGljX2Nhc3Q8c3RyaW5nX3ZpZXc6OnNpemVfdHlwZT4oIHAgLSBhcmcgKSk7CisgICAgICAgIHArKzsKKyAgICAgICAgfQorCisgICAgc3IxID0gYXJnOworICAgIHAgPSBhcmc7CisvLyAgZm9yIGFsbCBwb3NzaWJsZSBjaGFycywgc2VlIGlmIHdlIGZpbmQgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2UuCisvLyAgTm90ZSB0aGF0IHN0cmNociB3aWxsL21pZ2h0IGRvIHRoZSBfd3JvbmdfIHRoaW5nIGlmIHdlIHNlYXJjaCBmb3IgTlVMTAorICAgIGZvciAoIGludCBjaCA9IDE7IGNoIDwgMjU2OyArK2NoICkgeworICAgICAgICBzdHJpbmdfdmlldzo6c2l6ZV90eXBlIHBvcyA9IHNyMS5maW5kKGNoKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RycCA9IHN0ZDo6c3RyY2hyICggYXJnLCBjaCApOworICAgICAgICBCT09TVF9URVNUICgoIHN0cnAgPT0gTlVMTCApID09ICggcG9zID09IHN0cmluZ192aWV3OjpucG9zICkpOworICAgICAgICBpZiAoIHN0cnAgIT0gTlVMTCApCisgICAgICAgICAgICBCT09TVF9URVNUICggcHRyX2RpZmYgKCBzdHJwLCBhcmcgKSA9PSBwb3MgKTsKKyAgICB9CisKKyAgICBzcjEgPSBhcmc7CisgICAgcCA9IGFyZzsKKy8vICBmb3IgYWxsIHBvc3NpYmxlIGNoYXJzLCBzZWUgaWYgd2UgZmluZCB0aGVtIGluIHRoZSByaWdodCBwbGFjZS4KKy8vICBOb3RlIHRoYXQgc3RyY2hyIHdpbGwvbWlnaHQgZG8gdGhlIF93cm9uZ18gdGhpbmcgaWYgd2Ugc2VhcmNoIGZvciBOVUxMCisgICAgZm9yICggaW50IGNoID0gMTsgY2ggPCAyNTY7ICsrY2ggKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLnJmaW5kKGNoKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RycCA9IHN0ZDo6c3RycmNociAoIGFyZywgY2ggKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoKCBzdHJwID09IE5VTEwgKSA9PSAoIHBvcyA9PSBzdHJpbmdfdmlldzo6bnBvcyApKTsKKyAgICAgICAgaWYgKCBzdHJwICE9IE5VTEwgKQorICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHB0cl9kaWZmICggc3RycCwgYXJnICkgPT0gcG9zICk7CisgICAgfQorCisKKy8vICBGaW5kIGV2ZXJ5dGhpbmcgYXQgdGhlIHN0YXJ0CisgICAgcCA9IGFyZzsKKyAgICBzcjEgPSBhcmc7CisgICAgd2hpbGUgKCAhc3IxLmVtcHR5ICgpKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmQoKnApOworICAgICAgICBCT09TVF9URVNUICggcG9zID09IDAgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9wcmVmaXggKDEpOworICAgICAgICArK3A7CisgICAgICAgIH0KKworLy8gIEZpbmQgZXZlcnl0aGluZyBhdCB0aGUgZW5kCisgICAgc3IxICA9IGFyZzsKKyAgICBwICAgID0gYXJnICsgc3RkOjpzdHJsZW4gKCBhcmcgKSAtIDE7CisgICAgd2hpbGUgKCAhc3IxLmVtcHR5ICgpKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLnJmaW5kKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvcyA9PSBzcjEuc2l6ZSAoKSAtIDEgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9zdWZmaXggKDEpOworICAgICAgICAtLXA7CisgICAgICAgIH0KKworLy8gIEZpbmQgZXZlcnl0aGluZyBhdCB0aGUgc3RhcnQKKyAgICBzcjEgID0gYXJnOworICAgIHAgICAgPSBhcmc7CisgICAgd2hpbGUgKCAhc3IxLmVtcHR5ICgpKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zID0gc3IxLmZpbmRfZmlyc3Rfb2YoKnApOworICAgICAgICBCT09TVF9URVNUICggcG9zID09IDAgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9wcmVmaXggKDEpOworICAgICAgICArK3A7CisgICAgICAgIH0KKworCisvLyAgRmluZCBldmVyeXRoaW5nIGF0IHRoZSBlbmQKKyAgICBzcjEgID0gYXJnOworICAgIHAgICAgPSBhcmcgKyBzdGQ6OnN0cmxlbiAoIGFyZyApIC0gMTsKKyAgICB3aGlsZSAoICFzcjEuZW1wdHkgKCkpIHsKKyAgICAgICAgc3RyaW5nX3ZpZXc6OnNpemVfdHlwZSBwb3MgPSBzcjEuZmluZF9sYXN0X29mKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvcyA9PSBzcjEuc2l6ZSAoKSAtIDEgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9zdWZmaXggKDEpOworICAgICAgICAtLXA7CisgICAgICAgIH0KKworLy8gIEJhc2ljIHNhbml0eSBjaGVja2luZyBmb3IgImZpbmRfZmlyc3Rfb2YgLyBmaW5kX2ZpcnN0X25vdF9vZiIKKyAgICBzcjEgPSBhcmc7CisgICAgc3IyID0gYXJnOworICAgIHdoaWxlICggIXNyMS5lbXB0eSgpICkgeworICAgICAgICBCT09TVF9URVNUICggc3IxLmZpbmRfZmlyc3Rfb2YgKCBzcjIgKSAgICAgPT0gMCApOworICAgICAgICBCT09TVF9URVNUICggc3IxLmZpbmRfZmlyc3Rfbm90X29mICggc3IyICkgPT0gc3RyaW5nX3ZpZXc6Om5wb3MgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9wcmVmaXggKCAxICk7CisgICAgICAgIH0KKworICAgIHAgPSBhcmc7CisgICAgc3IxID0gYXJnOworICAgIHdoaWxlICggKnAgKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zMSA9IHNyMS5maW5kX2ZpcnN0X29mKCpwKTsKKyAgICAgICAgc3RyaW5nX3ZpZXc6OnNpemVfdHlwZSBwb3MyID0gc3IxLmZpbmRfZmlyc3Rfbm90X29mKCpwKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHBvczEgIT0gc3RyaW5nX3ZpZXc6Om5wb3MgJiYgcG9zMSA8IHNyMS5zaXplICgpICYmIHBvczEgPD0gcHRyX2RpZmYgKCBwLCBhcmcgKSk7CisgICAgICAgIGlmICggcG9zMiAhPSBzdHJpbmdfdmlldzo6bnBvcyApIHsKKyAgICAgICAgICAgIGZvciAoIHNpemVfdCBpID0gMCA7IGkgPCBwb3MyOyArK2kgKQorICAgICAgICAgICAgICAgIEJPT1NUX1RFU1QgKCBzcjFbaV0gPT0gKnAgKTsKKyAgICAgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgWyBwb3MyIF0gIT0gKnAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBCT09TVF9URVNUICggcG9zMiAhPSBwb3MxICk7CisgICAgICAgICsrcDsKKyAgICAgICAgfQorCisvLyAgQmFzaWMgc2FuaXR5IGNoZWNraW5nIGZvciAiZmluZF9sYXN0X29mIC8gZmluZF9sYXN0X25vdF9vZiIKKyAgICBzcjEgPSBhcmc7CisgICAgc3IyID0gYXJnOworICAgIHdoaWxlICggIXNyMS5lbXB0eSgpICkgeworICAgICAgICBCT09TVF9URVNUICggc3IxLmZpbmRfbGFzdF9vZiAoIHNyMiApICAgICA9PSAoIHNyMS5zaXplICgpIC0gMSApKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHNyMS5maW5kX2xhc3Rfbm90X29mICggc3IyICkgPT0gc3RyaW5nX3ZpZXc6Om5wb3MgKTsKKyAgICAgICAgc3IxLnJlbW92ZV9zdWZmaXggKCAxICk7CisgICAgICAgIH0KKworICAgIHAgPSBhcmc7CisgICAgc3IxID0gYXJnOworICAgIHdoaWxlICggKnAgKSB7CisgICAgICAgIHN0cmluZ192aWV3OjpzaXplX3R5cGUgcG9zMSA9IHNyMS5maW5kX2xhc3Rfb2YoKnApOworICAgICAgICBzdHJpbmdfdmlldzo6c2l6ZV90eXBlIHBvczIgPSBzcjEuZmluZF9sYXN0X25vdF9vZigqcCk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MxICE9IHN0cmluZ192aWV3OjpucG9zICYmIHBvczEgPCBzcjEuc2l6ZSAoKSAmJiBwb3MxID49IHB0cl9kaWZmICggcCwgYXJnICkpOworICAgICAgICBCT09TVF9URVNUICggcG9zMiA9PSBzdHJpbmdfdmlldzo6bnBvcyB8fCBwb3MxIDwgc3IxLnNpemUgKCkpOworICAgICAgICBpZiAoIHBvczIgIT0gc3RyaW5nX3ZpZXc6Om5wb3MgKSB7CisgICAgICAgICAgICBmb3IgKCBzaXplX3QgaSA9IHNyMS5zaXplICgpIC0xIDsgaSA+IHBvczI7IC0taSApCisgICAgICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHNyMVtpXSA9PSAqcCApOworICAgICAgICAgICAgQk9PU1RfVEVTVCAoIHNyMSBbIHBvczIgXSAhPSAqcCApOworICAgICAgICAgICAgfQorCisgICAgICAgIEJPT1NUX1RFU1QgKCBwb3MyICE9IHBvczEgKTsKKyAgICAgICAgKytwOworICAgICAgICB9CisKKyAgICB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgY3VzdG9tX2FsbG9jYXRvciB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7CisgICAgdHlwZWRlZiBUKiBwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3QgVCogY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQqIHZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3ZvaWRfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHNpemVfdHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICB0eXBlZGVmIFQmIHJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IFQmIGNvbnN0X3JlZmVyZW5jZTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFU+CisgICAgc3RydWN0IHJlYmluZCB7CisgICAgICAgIHR5cGVkZWYgY3VzdG9tX2FsbG9jYXRvcjxVPiBvdGhlcjsKKyAgICAgICAgfTsKKworICAgIGN1c3RvbV9hbGxvY2F0b3IoKSBCT09TVF9OT0VYQ0VQVCB7fQorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIGN1c3RvbV9hbGxvY2F0b3IoY3VzdG9tX2FsbG9jYXRvcjxVPiBjb25zdCYpIEJPT1NUX05PRVhDRVBUIHt9CisKKyAgICBwb2ludGVyIGFsbG9jYXRlKHNpemVfdHlwZSBuKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihzdGQ6Om1hbGxvYyhzaXplb2YodmFsdWVfdHlwZSkgKiBuKSk7CisgICAgICAgIH0KKyAgICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBwLCBzaXplX3R5cGUpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgc3RkOjpmcmVlKHApOworICAgICAgICB9CisKKyAgICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIHZhbHVlKSBjb25zdCBCT09TVF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiAmdmFsdWU7CisgICAgICAgIH0KKworICAgIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgdmFsdWUpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuICZ2YWx1ZTsKKyAgICAgICAgfQorCisgICAgQk9PU1RfQ09OU1RFWFBSIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IEJPT1NUX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuICh+KHNpemVfdHlwZSkwdSkgLyBzaXplb2YodmFsdWVfdHlwZSk7CisgICAgICAgIH0KKworI2lmICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX1JWQUxVRV9SRUZFUkVOQ0VTKQorI2lmICFkZWZpbmVkKEJPT1NUX05PX0NYWDExX1ZBUklBRElDX1RFTVBMQVRFUykKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MuLi4gQXJncz4KKyAgICB2b2lkIGNvbnN0cnVjdChVKiBwdHIsIEFyZ3MmJi4uLiBhcmdzKSBjb25zdCB7CisgICAgICAgIDo6bmV3KCh2b2lkKilwdHIpIFUoc3RhdGljX2Nhc3Q8QXJncyYmPihhcmdzKS4uLik7CisgICAgICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzIFY+CisgICAgdm9pZCBjb25zdHJ1Y3QoVSogcHRyLCBWJiYgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgOjpuZXcoKHZvaWQqKXB0cikgVShzdGF0aWNfY2FzdDxWJiY+KHZhbHVlKSk7CisgICAgICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4KKyAgICB2b2lkIGNvbnN0cnVjdChVKiBwdHIsIGNvbnN0IFYmIHZhbHVlKSBjb25zdCB7CisgICAgICAgIDo6bmV3KCh2b2lkKilwdHIpIFUodmFsdWUpOworICAgICAgICB9CisjZW5kaWYKKworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgIHZvaWQgY29uc3RydWN0KFUqIHB0cikgY29uc3QgeworICAgICAgICA6Om5ldygodm9pZCopcHRyKSBVKCk7CisgICAgICAgIH0KKworICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgIHZvaWQgZGVzdHJveShVKiBwdHIpIGNvbnN0IHsKKyAgICAgICAgKHZvaWQpcHRyOworICAgICAgICBwdHItPn5VKCk7CisgICAgICAgIH0KKyAgICB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK0JPT1NUX0NPTlNURVhQUiBib29sIG9wZXJhdG9yPT0oY29uc3QgY3VzdG9tX2FsbG9jYXRvcjxUPiAmLCBjb25zdCBjdXN0b21fYWxsb2NhdG9yPFU+ICYpIEJPT1NUX05PRVhDRVBUIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK0JPT1NUX0NPTlNURVhQUiBib29sIG9wZXJhdG9yIT0oY29uc3QgY3VzdG9tX2FsbG9jYXRvcjxUPiAmLCBjb25zdCBjdXN0b21fYWxsb2NhdG9yPFU+ICYpIEJPT1NUX05PRVhDRVBUIHsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit2b2lkIHRvX3N0cmluZyAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKyAgICBzdHJpbmdfdmlldyBzcjE7CisgICAgc3RkOjpzdHJpbmcgc3RyMTsKKyAgICBzdGQ6OnN0cmluZyBzdHIyOworCisgICAgc3RyMS5hc3NpZ24gKCBhcmcgKTsKKyAgICBzcjEgPSBhcmc7CisvLyAgc3RyMiA9IHNyMS50b19zdHJpbmc8c3RkOjphbGxvY2F0b3I8Y2hhcj4gPiAoKTsKKyAgICBzdHIyID0gc3IxLnRvX3N0cmluZyAoKTsKKyAgICBCT09TVF9URVNUICggc3RyMSA9PSBzdHIyICk7CisKKyAgICBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBjdXN0b21fYWxsb2NhdG9yPGNoYXI+ID4gc3RyMyA9IHNyMS50b19zdHJpbmcoY3VzdG9tX2FsbG9jYXRvcjxjaGFyPigpKTsKKyAgICBCT09TVF9URVNUICggc3RkOjpzdHJjbXAoc3RyMS5jX3N0cigpLCBzdHIzLmNfc3RyKCkpID09IDAgKTsKKworI2lmbmRlZiBCT09TVF9OT19DWFgxMV9FWFBMSUNJVF9DT05WRVJTSU9OX09QRVJBVE9SUworICAgIHN0ZDo6c3RyaW5nIHN0cjQgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZz4gKCBzcjEgKTsKKyAgICBCT09TVF9URVNUICggc3RyMSA9PSBzdHI0ICk7CisjZW5kaWYKKyAgICB9CisKK3ZvaWQgY29tcGFyZSAoIGNvbnN0IGNoYXIgKmFyZyApIHsKKyAgICBzdHJpbmdfdmlldyBzcjE7CisgICAgc3RkOjpzdHJpbmcgc3RyMTsKKyAgICBzdGQ6OnN0cmluZyBzdHIyID0gc3RyMTsKKworICAgIHN0cjEuYXNzaWduICggYXJnICk7CisgICAgc3IxID0gYXJnOworICAgIEJPT1NUX1RFU1QgKCBzcjEgID09IHNyMSk7ICAgIC8vIGNvbXBhcmUgc3RyaW5nX3ZpZXcgYW5kIHN0cmluZ192aWV3CisgICAgQk9PU1RfVEVTVCAoIHNyMSAgPT0gc3RyMSk7ICAgLy8gY29tcGFyZSBzdHJpbmcgYW5kIHN0cmluZ192aWV3CisgICAgQk9PU1RfVEVTVCAoIHN0cjEgPT0gc3IxICk7ICAgLy8gY29tcGFyZSBzdHJpbmdfdmlldyBhbmQgc3RyaW5nCisgICAgQk9PU1RfVEVTVCAoIHNyMSAgPT0gYXJnICk7ICAgLy8gY29tcGFyZSBzdHJpbmdfdmlldyBhbmQgcG9pbnRlcgorICAgIEJPT1NUX1RFU1QgKCBhcmcgID09IHNyMSApOyAgIC8vIGNvbXBhcmUgcG9pbnRlciBhbmQgc3RyaW5nX3ZpZXcKKworICAgIGlmICggc3IxLnNpemUgKCkgPiAwICkgeworICAgICAgICAoKnN0cjEucmJlZ2luKCkpKys7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgICE9IHN0cjEgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHN0cjEgIT0gc3IxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPCBzdHIxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPD0gc3RyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA+IHNyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA+PSBzcjEgKTsKKworICAgICAgICAoKnN0cjEucmJlZ2luKCkpIC09IDI7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgICE9IHN0cjEgKTsKKyAgICAgICAgQk9PU1RfVEVTVCAoIHN0cjEgIT0gc3IxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPiBzdHIxICk7CisgICAgICAgIEJPT1NUX1RFU1QgKCBzcjEgPj0gc3RyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA8IHNyMSApOworICAgICAgICBCT09TVF9URVNUICggc3RyMSA8PSBzcjEgKTsKKyAgICAgICAgfQorICAgIH0KKworY29uc3QgY2hhciAqdGVzdF9zdHJpbmdzIFtdID0geworICAgICIiLAorICAgICIwIiwKKyAgICAiYWJjIiwKKyAgICAiQUFBIiwgIC8vIGFsbCB0aGUgc2FtZQorICAgICJhZHNmYWRhZGlhZWY7YWxrZGc7YWxqdDtqIGFnbDtzanJsO3RqcztsZ2E7bHJldGo7c3JnW3czNDl1NTIwOWRzZmFkZmFzZGZhc2RmYWRzZiIsCisgICAgImFiY1wwYXNkZmFkc2Zhc2YiLAorICAgIE5VTEwKKyAgICB9OworCitpbnQgbWFpbigpCit7CisgICAgY29uc3QgY2hhciAqKnAgPSAmdGVzdF9zdHJpbmdzWzBdOworCisgICAgd2hpbGUgKCAqcCAhPSBOVUxMICkgeworICAgICAgICBzdGFydHNfd2l0aCAoICpwICk7CisgICAgICAgIGVuZHNfd2l0aCAoICpwICk7CisgICAgICAgIHJldmVyc2UgKCAqcCApOworICAgICAgICBmaW5kICggKnAgKTsKKyAgICAgICAgdG9fc3RyaW5nICggKnAgKTsKKyAgICAgICAgY29tcGFyZSAoICpwICk7CisKKyAgICAgICAgcCsrOworICAgICAgICB9CisKKyAgICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qvc3RyaW5nX3ZpZXdfdGVzdF9pby5jcHAgYi90ZXN0L3N0cmluZ192aWV3X3Rlc3RfaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmZmMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3N0cmluZ192aWV3X3Rlc3RfaW8uY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogICAgICAgICAgICAgQ29weXJpZ2h0IEFuZHJleSBTZW1hc2hldiAyMDEzLgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgorICogICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorICogICAgICAgICAgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisvKiEKKyAqIFxmaWxlICAgc3RyaW5nX3JlZl90ZXN0X2lvLmNwcAorICogXGF1dGhvciBBbmRyZXkgU2VtYXNoZXYKKyAqIFxkYXRlICAgMjYuMDUuMjAxMworICoKKyAqIFxicmllZiAgVGhpcyBoZWFkZXIgY29udGFpbnMgdGVzdHMgZm9yIHN0cmVhbSBvcGVyYXRpb25zIG9mIFxjIGJhc2ljX3N0cmluZ19yZWYuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvc3RyaW5nX3ZpZXcuaHBwPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxib29zdC9jb25maWcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2NvcmUvbGlnaHR3ZWlnaHRfdGVzdC5ocHA+CisKKy8qIEN1cnJlbnQgaW1wbGVtZW50YXRpb25zIHNlZW0gdG8gYmUgbWlzc2luZyBjb2RlY3Z0IGZhY2V0cyB0byBjb252ZXJ0IGNoYXJzIHRvIGNoYXIxNl90IGFuZCBjaGFyMzJfdCBldmVuIHRob3VnaCB0aGUgdHlwZXMgYXJlIGF2YWlsYWJsZS4KKyovCisKK3N0YXRpYyBjb25zdCBjaGFyKiB0ZXN0X3N0cmluZ3NbXSA9Cit7CisgICAgImJlZ2luIiwKKyAgICAiYWJjZCIsCisgICAgImVuZCIKK307CisKKy8vISBUaGUgY29udGV4dCB3aXRoIHRlc3QgZGF0YSBmb3IgcGFydGljdWxhciBjaGFyYWN0ZXIgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIENoYXJUID4KK3N0cnVjdCBjb250ZXh0Cit7CisgICAgdHlwZWRlZiBDaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzwgY2hhcl90eXBlID4gc3RyaW5nX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJpbmdzdHJlYW08IGNoYXJfdHlwZSA+IG9zdHJlYW1fdHlwZTsKKworICAgIHN0cmluZ190eXBlIGJlZ2luLCBhYmNkLCBlbmQ7CisKKyAgICBjb250ZXh0KCkKKyAgICB7CisgICAgICAgIGJvb3N0OjpzdHJpbmdfdmlldyBzdHIgPSB0ZXN0X3N0cmluZ3NbMF07CisgICAgICAgIHN0ZDo6Y29weShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYmVnaW4pKTsKKworICAgICAgICBzdHIgPSB0ZXN0X3N0cmluZ3NbMV07CisgICAgICAgIHN0ZDo6Y29weShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWJjZCkpOworCisgICAgICAgIHN0ciA9IHRlc3Rfc3RyaW5nc1syXTsKKyAgICAgICAgc3RkOjpjb3B5KHN0ci5iZWdpbigpLCBzdHIuZW5kKCksIHN0ZDo6YmFja19pbnNlcnRlcihlbmQpKTsKKyAgICB9Cit9OworCisvLyBUZXN0IHJlZ3VsYXIgb3V0cHV0Cit0ZW1wbGF0ZTxjbGFzcyBDaGFyVD4KK3ZvaWQgdGVzdF9zdHJpbmdfdmlld19vdXRwdXQoKQoreworICAgIHR5cGVkZWYgQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyaW5nc3RyZWFtPCBjaGFyX3R5cGUgPiBvc3RyZWFtX3R5cGU7CisgICAgdHlwZWRlZiBib29zdDo6YmFzaWNfc3RyaW5nX3ZpZXc8IGNoYXJfdHlwZSA+IHN0cmluZ192aWV3X3R5cGU7CisKKyAgICBjb250ZXh0PCBjaGFyX3R5cGUgPiBjdHg7CisKKyAgICBvc3RyZWFtX3R5cGUgc3RybTsKKyAgICBzdHJtIDw8IHN0cmluZ192aWV3X3R5cGUoY3R4LmFiY2QpOworICAgIEJPT1NUX1RFU1Qoc3RybS5zdHIoKSA9PSBjdHguYWJjZCk7Cit9CisKKy8vIFRlc3Qgc3VwcG9ydCBmb3IgcGFkZGluZwordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3RfcGFkZGluZygpCit7CisgICAgdHlwZWRlZiBDaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJpbmdzdHJlYW08IGNoYXJfdHlwZSA+IG9zdHJlYW1fdHlwZTsKKyAgICB0eXBlZGVmIGJvb3N0OjpiYXNpY19zdHJpbmdfdmlldzwgY2hhcl90eXBlID4gc3RyaW5nX3ZpZXdfdHlwZTsKKworICAgIGNvbnRleHQ8IGNoYXJfdHlwZSA+IGN0eDsKKworICAgIC8vIFRlc3QgZm9yIHBhZGRpbmcKKyAgICB7CisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX3JlZjsKKyAgICAgICAgc3RybV9yZWYgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0dyg4KSA8PCBzdHJpbmdfdmlld190eXBlKGN0eC5hYmNkKSA8PCBjdHguZW5kOworCisgICAgICAgIG9zdHJlYW1fdHlwZSBzdHJtX2NvcnJlY3Q7CisgICAgICAgIHN0cm1fY29ycmVjdCA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgZm9yIGxvbmcgcGFkZGluZworICAgIHsKKyAgICAgICAgb3N0cmVhbV90eXBlIHN0cm1fcmVmOworICAgICAgICBzdHJtX3JlZiA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXR3KDEwMCkgPDwgc3RyaW5nX3ZpZXdfdHlwZShjdHguYWJjZCkgPDwgY3R4LmVuZDsKKworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9jb3JyZWN0OworICAgICAgICBzdHJtX2NvcnJlY3QgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0dygxMDApIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KKworICAgIC8vIFRlc3QgdGhhdCBzaG9ydCB3aWR0aCBkb2VzIG5vdCB0cnVuY2F0ZSB0aGUgc3RyaW5nCisgICAgeworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9yZWY7CisgICAgICAgIHN0cm1fcmVmIDw8IGN0eC5iZWdpbiA8PCBzdGQ6OnNldHcoMSkgPDwgc3RyaW5nX3ZpZXdfdHlwZShjdHguYWJjZCkgPDwgY3R4LmVuZDsKKworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9jb3JyZWN0OworICAgICAgICBzdHJtX2NvcnJlY3QgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0dygxKSA8PCBjdHguYWJjZCA8PCBjdHguZW5kOworCisgICAgICAgIEJPT1NUX1RFU1Qoc3RybV9yZWYuc3RyKCkgPT0gc3RybV9jb3JyZWN0LnN0cigpKTsKKyAgICB9Cit9CisKKy8vIFRlc3Qgc3VwcG9ydCBmb3IgcGFkZGluZyBmaWxsCit0ZW1wbGF0ZTxjbGFzcyBDaGFyVD4KK3ZvaWQgdGVzdF9wYWRkaW5nX2ZpbGwoKQoreworICAgIHR5cGVkZWYgQ2hhclQgY2hhcl90eXBlOworICAgIHR5cGVkZWYgc3RkOjpiYXNpY19vc3RyaW5nc3RyZWFtPCBjaGFyX3R5cGUgPiBvc3RyZWFtX3R5cGU7CisgICAgdHlwZWRlZiBib29zdDo6YmFzaWNfc3RyaW5nX3ZpZXc8IGNoYXJfdHlwZSA+IHN0cmluZ192aWV3X3R5cGU7CisKKyAgICBjb250ZXh0PCBjaGFyX3R5cGUgPiBjdHg7CisKKyAgICBvc3RyZWFtX3R5cGUgc3RybV9yZWY7CisgICAgc3RybV9yZWYgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6c2V0ZmlsbChzdGF0aWNfY2FzdDwgY2hhcl90eXBlID4oJ3gnKSkgPDwgc3RkOjpzZXR3KDgpIDw8IHN0cmluZ192aWV3X3R5cGUoY3R4LmFiY2QpIDw8IGN0eC5lbmQ7CisKKyAgICBvc3RyZWFtX3R5cGUgc3RybV9jb3JyZWN0OworICAgIHN0cm1fY29ycmVjdCA8PCBjdHguYmVnaW4gPDwgc3RkOjpzZXRmaWxsKHN0YXRpY19jYXN0PCBjaGFyX3R5cGUgPigneCcpKSA8PCBzdGQ6OnNldHcoOCkgPDwgY3R4LmFiY2QgPDwgY3R4LmVuZDsKKworICAgIEJPT1NUX1RFU1Qoc3RybV9yZWYuc3RyKCkgPT0gc3RybV9jb3JyZWN0LnN0cigpKTsKK30KKworLy8gVGVzdCBzdXBwb3J0IGZvciBhbGlnbm1lbnQKK3RlbXBsYXRlPGNsYXNzIENoYXJUPgordm9pZCB0ZXN0X2FsaWdubWVudCgpCit7CisgICAgdHlwZWRlZiBDaGFyVCBjaGFyX3R5cGU7CisgICAgdHlwZWRlZiBzdGQ6OmJhc2ljX29zdHJpbmdzdHJlYW08IGNoYXJfdHlwZSA+IG9zdHJlYW1fdHlwZTsKKyAgICB0eXBlZGVmIGJvb3N0OjpiYXNpY19zdHJpbmdfdmlldzwgY2hhcl90eXBlID4gc3RyaW5nX3ZpZXdfdHlwZTsKKworICAgIGNvbnRleHQ8IGNoYXJfdHlwZSA+IGN0eDsKKworICAgIC8vIExlZnQgYWxpZ25tZW50CisgICAgeworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9yZWY7CisgICAgICAgIHN0cm1fcmVmIDw8IGN0eC5iZWdpbiA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KDgpIDw8IHN0cmluZ192aWV3X3R5cGUoY3R4LmFiY2QpIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgb3N0cmVhbV90eXBlIHN0cm1fY29ycmVjdDsKKyAgICAgICAgc3RybV9jb3JyZWN0IDw8IGN0eC5iZWdpbiA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KKworICAgIC8vIFJpZ2h0IGFsaWdubWVudAorICAgIHsKKyAgICAgICAgb3N0cmVhbV90eXBlIHN0cm1fcmVmOworICAgICAgICBzdHJtX3JlZiA8PCBjdHguYmVnaW4gPDwgc3RkOjpyaWdodCA8PCBzdGQ6OnNldHcoOCkgPDwgc3RyaW5nX3ZpZXdfdHlwZShjdHguYWJjZCkgPDwgY3R4LmVuZDsKKworICAgICAgICBvc3RyZWFtX3R5cGUgc3RybV9jb3JyZWN0OworICAgICAgICBzdHJtX2NvcnJlY3QgPDwgY3R4LmJlZ2luIDw8IHN0ZDo6cmlnaHQgPDwgc3RkOjpzZXR3KDgpIDw8IGN0eC5hYmNkIDw8IGN0eC5lbmQ7CisKKyAgICAgICAgQk9PU1RfVEVTVChzdHJtX3JlZi5zdHIoKSA9PSBzdHJtX2NvcnJlY3Quc3RyKCkpOworICAgIH0KK30KKwordGVtcGxhdGU8Y2xhc3MgQ2hhclQ+Cit2b2lkIHRlc3QoKQoreworICAgIHRlc3Rfc3RyaW5nX3ZpZXdfb3V0cHV0PENoYXJUPigpOworICAgIHRlc3RfcGFkZGluZzxDaGFyVD4oKTsKKyAgICB0ZXN0X3BhZGRpbmdfZmlsbDxDaGFyVD4oKTsKKyAgICB0ZXN0X2FsaWdubWVudDxDaGFyVD4oKTsKK30KKworaW50IG1haW4oKQoreworICAgIHRlc3Q8Y2hhcj4oKTsKKyAgICB0ZXN0PHdjaGFyX3Q+KCk7CisgICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3ZhbHVlX2luaXRfdGVzdC5jcHAgYi90ZXN0L3ZhbHVlX2luaXRfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3ZWMzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmFsdWVfaW5pdF90ZXN0LmNwcApAQCAtMCwwICsxLDM3MSBAQAorLy8gQ29weXJpZ2h0IDIwMDItMjAwOCwgRmVybmFuZG8gTHVpcyBDYWNjaW9sYSBDYXJiYWxsYWwuCisvLworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8KKy8vIFRlc3QgcHJvZ3JhbSBmb3IgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisvLworLy8gMjEgQWdvIDIwMDIgKENyZWF0ZWQpIEZlcm5hbmRvIENhY2Npb2xhCisvLyAxNSBKYW4gMjAwOCAoQWRkZWQgdGVzdHMgcmVnYXJkaW5nIGNvbXBpbGVyIGlzc3VlcykgRmVybmFuZG8gQ2FjY2lvbGEsIE5pZWxzIERla2tlcgorLy8gMjMgTWF5IDIwMDggKEFkZGVkIHRlc3RzIHJlZ2FyZGluZyBpbml0aWFsaXplZF92YWx1ZSkgTmllbHMgRGVra2VyCisvLyAyMSBBZ28gMjAwOCAoQWRkZWQgc3dhcCB0ZXN0KSBOaWVscyBEZWtrZXIKKworI2luY2x1ZGUgPGNzdHJpbmc+ICAvLyBGb3IgbWVtY21wLgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisKKyNpbmNsdWRlIDxib29zdC9jb3JlL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgorCisvLworLy8gU2FtcGxlIFBPRCB0eXBlCisvLworc3RydWN0IFBPRAoreworICBQT0QgKCkgOiBmKDApLCBjKDApLCBpKDApe30KKworICBQT0QgKCBjaGFyIGNfLCBpbnQgaV8sIGZsb2F0IGZfICkgOiBmKGZfKSwgYyhjXyksIGkoaV8pIHt9CisKKyAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBQT0QgY29uc3QmIHBvZCApCisgICAgeyByZXR1cm4gb3MgPDwgJygnIDw8IHBvZC5jIDw8ICcsJyA8PCBwb2QuaSA8PCAnLCcgPDwgcG9kLmYgPDwgJyknIDsgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggUE9EIGNvbnN0JiBsaHMsIFBPRCBjb25zdCYgcmhzICkKKyAgICB7IHJldHVybiBsaHMuZiA9PSByaHMuZiAmJiBsaHMuYyA9PSByaHMuYyAmJiBsaHMuaSA9PSByaHMuaSA7IH0KKworICBmbG9hdCBmOworICBjaGFyICBjOworICBpbnQgICBpOworfSA7CisKKy8vCisvLyBTYW1wbGUgbm9uIFBPRCB0eXBlCisvLworc3RydWN0IE5vblBPREJhc2UKK3sKKyAgdmlydHVhbCB+Tm9uUE9EQmFzZSgpIHt9Cit9IDsKK3N0cnVjdCBOb25QT0QgOiBOb25QT0RCYXNlCit7CisgIE5vblBPRCAoKSA6IGlkKCkge30KKyAgZXhwbGljaXQgTm9uUE9EICggc3RkOjpzdHJpbmcgY29uc3QmIGlkXykgOiBpZChpZF8pIHt9CisKKyAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBOb25QT0QgY29uc3QmIG5wb2QgKQorICAgIHsgcmV0dXJuIG9zIDw8ICcoJyA8PCBucG9kLmlkIDw8ICcpJyA7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIE5vblBPRCBjb25zdCYgbGhzLCBOb25QT0QgY29uc3QmIHJocyApCisgICAgeyByZXR1cm4gbGhzLmlkID09IHJocy5pZCA7IH0KKworICBzdGQ6OnN0cmluZyBpZCA7Cit9IDsKKworLy8KKy8vIFNhbXBsZSBhZ2dyZWdhdGUgUE9EIHN0cnVjdCB0eXBlCisvLyBTb21lIGNvbXBpbGVycyBkbyBub3QgY29ycmVjdGx5IHZhbHVlLWluaXRpYWxpemUgc3VjaCBhIHN0cnVjdCwgZm9yIGV4YW1wbGU6CisvLyBCb3JsYW5kIEMrKyBSZXBvcnQgIzUxODU0LCAiVmFsdWUtaW5pdGlhbGl6YXRpb246IFBPRCBzdHJ1Y3Qgc2hvdWxkIGJlIHplcm8taW5pdGlhbGl6ZWQgIgorLy8gaHR0cDovL3FjLmNvZGVnZWFyLmNvbS93Yy9xY21haW4uYXNweD9kPTUxODU0CisvLworc3RydWN0IEFnZ3JlZ2F0ZVBPRFN0cnVjdAoreworICBmbG9hdCBmOworICBjaGFyICBjOworICBpbnQgICBpOworfTsKKworYm9vbCBvcGVyYXRvciA9PSAoIEFnZ3JlZ2F0ZVBPRFN0cnVjdCBjb25zdCYgbGhzLCBBZ2dyZWdhdGVQT0RTdHJ1Y3QgY29uc3QmIHJocyApCit7IHJldHVybiBsaHMuZiA9PSByaHMuZiAmJiBsaHMuYyA9PSByaHMuYyAmJiBsaHMuaSA9PSByaHMuaSA7IH0KKworLy8KKy8vIEFuIGFnZ3JlZ2F0ZSBzdHJ1Y3QgdGhhdCBjb250YWlucyBhbiBzdGQ6OnN0cmluZyBhbmQgYW4gaW50LgorLy8gUGF2ZWwgS3V6bmV0c292IChNZXRhQ29tbXVuaWNhdGlvbnMgRW5naW5lZXJpbmcpIHVzZWQgYSBzdHJ1Y3QgbGlrZQorLy8gdGhpcyB0byByZXByb2R1Y2UgdGhlIE1pY3Jvc29mdCBWaXN1YWwgQysrIGNvbXBpbGVyIGJ1ZywgcmVwb3J0ZWQgYXMKKy8vIEZlZWRiYWNrIElEIDEwMDc0NCwgIlZhbHVlLWluaXRpYWxpemF0aW9uIGluIG5ldy1leHByZXNzaW9uIgorLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL1ZpZXdGZWVkYmFjay5hc3B4P0ZlZWRiYWNrSUQ9MTAwNzQ0CisvLworc3RydWN0IFN0cmluZ0FuZEludAoreworICBzdGQ6OnN0cmluZyBzOworICBpbnQgaTsKK307CisKK2Jvb2wgb3BlcmF0b3IgPT0gKCBTdHJpbmdBbmRJbnQgY29uc3QmIGxocywgU3RyaW5nQW5kSW50IGNvbnN0JiByaHMgKQoreyByZXR1cm4gbGhzLnMgPT0gcmhzLnMgJiYgbGhzLmkgPT0gcmhzLmkgOyB9CisKKworLy8KKy8vIEEgc3RydWN0IHRoYXQgaGFzIGFuIGV4cGxpY2l0ICh1c2VyIGRlZmluZWQpIGRlc3RydWN0b3IuCisvLyBTb21lIGNvbXBpbGVycyBkbyBub3QgY29ycmVjdGx5IHZhbHVlLWluaXRpYWxpemUgc3VjaCBhIHN0cnVjdCwgZm9yIGV4YW1wbGU6CisvLyBNaWNyb3NvZnQgVmlzdWFsIEMrKywgRmVlZGJhY2sgSUQgMTAwNzQ0LCAiVmFsdWUtaW5pdGlhbGl6YXRpb24gaW4gbmV3LWV4cHJlc3Npb24iCisvLyBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svVmlld0ZlZWRiYWNrLmFzcHg/RmVlZGJhY2tJRD0xMDA3NDQKKy8vCitzdHJ1Y3QgU3RydWN0V2l0aERlc3RydWN0b3IKK3sKKyAgaW50IGk7CisgIH5TdHJ1Y3RXaXRoRGVzdHJ1Y3RvcigpIHt9Cit9OworCitib29sIG9wZXJhdG9yID09ICggU3RydWN0V2l0aERlc3RydWN0b3IgY29uc3QmIGxocywgU3RydWN0V2l0aERlc3RydWN0b3IgY29uc3QmIHJocyApCit7IHJldHVybiBsaHMuaSA9PSByaHMuaSA7IH0KKworCisvLworLy8gQSBzdHJ1Y3QgdGhhdCBoYXMgYSB2aXJ0dWFsIGZ1bmN0aW9uLgorLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGNvcnJlY3RseSB2YWx1ZS1pbml0aWFsaXplIHN1Y2ggYSBzdHJ1Y3QgZWl0aGVyLCBmb3IgZXhhbXBsZToKKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrLCBGZWVkYmFjayBJRCAxMDA3NDQsICJWYWx1ZS1pbml0aWFsaXphdGlvbiBpbiBuZXctZXhwcmVzc2lvbiIKKy8vIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL1Zpc3VhbFN0dWRpby9mZWVkYmFjay9WaWV3RmVlZGJhY2suYXNweD9GZWVkYmFja0lEPTEwMDc0NAorLy8KK3N0cnVjdCBTdHJ1Y3RXaXRoVmlydHVhbEZ1bmN0aW9uCit7CisgIGludCBpOworICB2aXJ0dWFsIHZvaWQgVmlydHVhbEZ1bmN0aW9uKCk7IAorfTsKKwordm9pZCBTdHJ1Y3RXaXRoVmlydHVhbEZ1bmN0aW9uOjpWaXJ0dWFsRnVuY3Rpb24oKQoreworfQorCitib29sIG9wZXJhdG9yID09ICggU3RydWN0V2l0aFZpcnR1YWxGdW5jdGlvbiBjb25zdCYgbGhzLCBTdHJ1Y3RXaXRoVmlydHVhbEZ1bmN0aW9uIGNvbnN0JiByaHMgKQoreyByZXR1cm4gbGhzLmkgPT0gcmhzLmkgOyB9CisKKworLy8KKy8vIEEgc3RydWN0IHRoYXQgaXMgZGVyaXZlZCBmcm9tIGFuIGFnZ3JlZ2F0ZSBQT0Qgc3RydWN0LgorLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGNvcnJlY3RseSB2YWx1ZS1pbml0aWFsaXplIHN1Y2ggYSBzdHJ1Y3QsIGZvciBleGFtcGxlOgorLy8gR0NDIEJ1Z3ppbGxhIEJ1ZyAzMDExMSwgICJWYWx1ZS1pbml0aWFsaXphdGlvbiBvZiBQT0QgYmFzZSBjbGFzcyBkb2Vzbid0IGluaXRpYWxpemUgbWVtYmVycyIsCisvLyByZXBvcnRlZCBieSBKb25hdGhhbiBXYWtlbHksIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzAxMTEKKy8vCitzdHJ1Y3QgRGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QgOiBBZ2dyZWdhdGVQT0RTdHJ1Y3QKK3sKKyAgRGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QoKSA6IEFnZ3JlZ2F0ZVBPRFN0cnVjdCgpIHt9Cit9OworCisvLworLy8gQSBzdHJ1Y3QgdGhhdCB3cmFwcyBhbiBhZ2dyZWdhdGUgUE9EIHN0cnVjdCBhcyBkYXRhIG1lbWJlci4KKy8vCitzdHJ1Y3QgQWdncmVnYXRlUE9EU3RydWN0V3JhcHBlcgoreworICBBZ2dyZWdhdGVQT0RTdHJ1Y3RXcmFwcGVyKCkgOiBkYXRhTWVtYmVyKCkge30KKyAgQWdncmVnYXRlUE9EU3RydWN0IGRhdGFNZW1iZXI7Cit9OworCitib29sIG9wZXJhdG9yID09ICggQWdncmVnYXRlUE9EU3RydWN0V3JhcHBlciBjb25zdCYgbGhzLCBBZ2dyZWdhdGVQT0RTdHJ1Y3RXcmFwcGVyIGNvbnN0JiByaHMgKQoreyByZXR1cm4gbGhzLmRhdGFNZW1iZXIgPT0gcmhzLmRhdGFNZW1iZXIgOyB9CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBBcnJheU9mQnl0ZXNbMjU2XTsKKworCisvLworLy8gQSBzdHJ1Y3QgdGhhdCBhbGxvd3MgdGVzdGluZyB3aGV0aGVyIHRoZSBhcHByb3ByaWF0ZSBjb3B5IGZ1bmN0aW9ucyBhcmUgY2FsbGVkLgorLy8KK3N0cnVjdCBDb3B5RnVuY3Rpb25DYWxsVGVzdGVyCit7CisgIGJvb2wgaXNfY29weV9jb25zdHJ1Y3RlZDsKKyAgYm9vbCBpc19hc3NpZ25tZW50X2NhbGxlZDsKKworICBDb3B5RnVuY3Rpb25DYWxsVGVzdGVyKCkKKyAgOiBpc19jb3B5X2NvbnN0cnVjdGVkKGZhbHNlKSwgaXNfYXNzaWdubWVudF9jYWxsZWQoZmFsc2UpIHt9CisKKyAgQ29weUZ1bmN0aW9uQ2FsbFRlc3Rlcihjb25zdCBDb3B5RnVuY3Rpb25DYWxsVGVzdGVyICYgKQorICA6IGlzX2NvcHlfY29uc3RydWN0ZWQodHJ1ZSksIGlzX2Fzc2lnbm1lbnRfY2FsbGVkKGZhbHNlKSB7fQorCisgIENvcHlGdW5jdGlvbkNhbGxUZXN0ZXIgJiBvcGVyYXRvcj0oY29uc3QgQ29weUZ1bmN0aW9uQ2FsbFRlc3RlciAmICkKKyAgeworICAgIGlzX2Fzc2lnbm1lbnRfY2FsbGVkID0gdHJ1ZSA7CisgICAgcmV0dXJuICp0aGlzIDsKKyAgfQorfTsKKworCisvLworLy8gQSBzdHJ1Y3QgdGhhdCBhbGxvd3MgdGVzdGluZyB3aGV0aGVyIGl0cyBjdXN0b21pemVkIHN3YXAgZnVuY3Rpb24gaXMgY2FsbGVkLgorLy8KK3N0cnVjdCBTd2FwRnVuY3Rpb25DYWxsVGVzdGVyCit7CisgIGJvb2wgaXNfY3VzdG9tX3N3YXBfY2FsbGVkOworICBpbnQgZGF0YTsKKworICBTd2FwRnVuY3Rpb25DYWxsVGVzdGVyKCkKKyAgOiBpc19jdXN0b21fc3dhcF9jYWxsZWQoZmFsc2UpLCBkYXRhKDApIHt9CisKKyAgU3dhcEZ1bmN0aW9uQ2FsbFRlc3Rlcihjb25zdCBTd2FwRnVuY3Rpb25DYWxsVGVzdGVyICYgYXJnKQorICA6IGlzX2N1c3RvbV9zd2FwX2NhbGxlZChmYWxzZSksIGRhdGEoYXJnLmRhdGEpIHt9CisKKyAgdm9pZCBzd2FwKFN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIgJiBhcmcpCisgIHsKKyAgICBzdGQ6OnN3YXAoZGF0YSwgYXJnLmRhdGEpOworICAgIGlzX2N1c3RvbV9zd2FwX2NhbGxlZCA9IHRydWU7CisgICAgYXJnLmlzX2N1c3RvbV9zd2FwX2NhbGxlZCA9IHRydWU7CisgIH0KK307CisKK3ZvaWQgc3dhcChTd2FwRnVuY3Rpb25DYWxsVGVzdGVyICYgbGhzLCBTd2FwRnVuY3Rpb25DYWxsVGVzdGVyICYgcmhzKQoreworICBsaHMuc3dhcChyaHMpOworfQorCisKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3ZvaWQgY2hlY2tfaW5pdGlhbGl6ZWRfdmFsdWUgKCBUIGNvbnN0JiB5ICkKK3sKKyAgVCBpbml0aWFsaXplZFZhbHVlID0gYm9vc3Q6OmluaXRpYWxpemVkX3ZhbHVlIDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0gaW5pdGlhbGl6ZWRWYWx1ZSApIDsKK30KKworI2lmZGVmICBfX0JPUkxBTkRDX18KKyNpZiBfX0JPUkxBTkRDX18gPT0gMHg1ODIKK3ZvaWQgY2hlY2tfaW5pdGlhbGl6ZWRfdmFsdWUoIE5vblBPRCBjb25zdCYgKQoreworICAvLyBUaGUgaW5pdGlhbGl6ZWRfdmFsdWUgY2hlY2sgaXMgc2tpcHBlZCBmb3IgQm9ybGFuZCA1LjgyCisgIC8vIGFuZCB0aGlzIHR5cGUgKE5vblBPRCksIGJlY2F1c2UgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQKKyAgLy8gd29uJ3QgY29tcGlsZSBvbiB0aGlzIHBhcnRpY3VsYXIgY29tcGlsZXIgdmVyc2lvbjoKKyAgLy8gICBOb25QT0QgaW5pdGlhbGl6ZWRWYWx1ZSA9IGJvb3N0Ojppbml0aWFsaXplZF92YWx1ZSgpIDsKKyAgLy8KKyAgLy8gVGhpcyBpcyBjYXVzZWQgYnkgYSBjb21waWxlciBidWcsIHRoYXQgaXMgZml4ZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24KKyAgLy8gb2YgdGhlIEJvcmxhbmQgY29tcGlsZXIuICBUaGUgUmVsZWFzZSBOb3RlcyBmb3IgRGVscGhpKFIpIDIwMDcgZm9yCisgIC8vIFdpbjMyKFIpIGFuZCBDKytCdWlsZGVyKFIpIDIwMDcgKGh0dHA6Ly9kbi5jb2RlZ2Vhci5jb20vYXJ0aWNsZS8zNjU3NSkKKyAgLy8gc2F5IGFib3V0IHNpbWlsYXIgc3RhdGVtZW50czoKKyAgLy8gICBib3RoIG9mIHRoZXNlIHN0YXRlbWVudHMgbm93IGNvbXBpbGUgYnV0IHVuZGVyIDUuODIgZ290IHRoZSBlcnJvcjoKKyAgLy8gICBFcnJvciBFMjAxNTogQW1iaWd1aXR5IGJldHdlZW4gJ1Y6OlYoY29uc3QgQSAmKScgYW5kICdWOjpWKGNvbnN0IFYgJiknCit9CisjZW5kaWYKKyNlbmRpZgorCisvLworLy8gVGhpcyB0ZXN0IGZ1bmN0aW9uIHRlc3RzIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiBmb3IgYSBzcGVjaWZpYyB0eXBlIFQuCisvLyBUaGUgZmlyc3QgYXJndW1lbnQgKHkpIGlzIGFzc3VtZWQgaGF2ZSB0aGUgdmFsdWUgb2YgYSB2YWx1ZS1pbml0aWFsaXplZCBvYmplY3QuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBUPgorYm9vbCB0ZXN0ICggVCBjb25zdCYgeSwgVCBjb25zdCYgeiApCit7CisgIGNvbnN0IGludCBlcnJvcnNfYmVmb3JlX3Rlc3QgPSBib29zdDo6ZGV0YWlsOjp0ZXN0X2Vycm9ycygpOworCisgIGNoZWNrX2luaXRpYWxpemVkX3ZhbHVlKHkpOworCisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiB4IDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0geCApIDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0gYm9vc3Q6OmdldCh4KSApIDsKKworICBzdGF0aWNfY2FzdDxUJj4oeCkgPSB6IDsKKyAgYm9vc3Q6OmdldCh4KSA9IHogOworICBCT09TVF9URVNUICggeCA9PSB6ICkgOworCisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiBjb25zdCB4X2MgOworICBCT09TVF9URVNUICggeSA9PSB4X2MgKSA7CisgIEJPT1NUX1RFU1QgKCB5ID09IGJvb3N0OjpnZXQoeF9jKSApIDsKKyAgVCYgeF9jX3JlZiA9IGNvbnN0X2Nhc3Q8VCY+KCBib29zdDo6Z2V0KHhfYykgKSA7CisgIHhfY19yZWYgPSB6IDsKKyAgQk9PU1RfVEVTVCAoIHhfYyA9PSB6ICkgOworCisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiBjb25zdCBjb3B5MSA9IHg7CisgIEJPT1NUX1RFU1QgKCBib29zdDo6Z2V0KGNvcHkxKSA9PSBib29zdDo6Z2V0KHgpICkgOworCisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiBjb3B5MjsKKyAgY29weTIgPSB4OworICBCT09TVF9URVNUICggYm9vc3Q6OmdldChjb3B5MikgPT0gYm9vc3Q6OmdldCh4KSApIDsKKworICB7CisgICAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPFQ+ICogcHRyID0gbmV3IGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPjsKKyAgICBCT09TVF9URVNUICggeSA9PSAqcHRyICkgOworICAgIGRlbGV0ZSBwdHI7CisgIH0KKworI2lmICFCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIDwgMTMwMCkKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPFQgY29uc3Q+IGN4IDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0gY3ggKSA7CisgIEJPT1NUX1RFU1QgKCB5ID09IGJvb3N0OjpnZXQoY3gpICkgOworCisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUIGNvbnN0PiBjb25zdCBjeF9jIDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0gY3hfYyApIDsKKyAgQk9PU1RfVEVTVCAoIHkgPT0gYm9vc3Q6OmdldChjeF9jKSApIDsKKyNlbmRpZgorCisgIHJldHVybiBib29zdDo6ZGV0YWlsOjp0ZXN0X2Vycm9ycygpID09IGVycm9yc19iZWZvcmVfdGVzdCA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgQk9PU1RfVEVTVCAoIHRlc3QoIDAsMTIzNCApICkgOworICBCT09TVF9URVNUICggdGVzdCggMC4wLDEyLjM0ICkgKSA7CisgIEJPT1NUX1RFU1QgKCB0ZXN0KCBQT0QoMCwwLDAuMCksIFBPRCgnYScsMTIzNCw1Ni43OGYpICkgKSA7CisgIEJPT1NUX1RFU1QgKCB0ZXN0KCBOb25QT0QoIHN0ZDo6c3RyaW5nKCkgKSwgTm9uUE9EKCBzdGQ6OnN0cmluZygic29tZXRoaW5nIikgKSApICkgOworCisgIE5vblBPRCBOb25QT0Rfb2JqZWN0KCBzdGQ6OnN0cmluZygiTm9uUE9EX29iamVjdCIpICk7CisgIEJPT1NUX1RFU1QgKCB0ZXN0PE5vblBPRCAqPiggMCwgJk5vblBPRF9vYmplY3QgKSApIDsKKworICBBZ2dyZWdhdGVQT0RTdHJ1Y3QgemVyb0luaXRpYWxpemVkQWdncmVnYXRlUE9EU3RydWN0ID0geyAwLjBmLCAnXDAnLCAwIH07CisgIEFnZ3JlZ2F0ZVBPRFN0cnVjdCBub25aZXJvSW5pdGlhbGl6ZWRBZ2dyZWdhdGVQT0RTdHJ1Y3QgPSB7IDEuMjVmLCAnYScsIC0xIH07CisgIEJPT1NUX1RFU1QgKCB0ZXN0KHplcm9Jbml0aWFsaXplZEFnZ3JlZ2F0ZVBPRFN0cnVjdCwgbm9uWmVyb0luaXRpYWxpemVkQWdncmVnYXRlUE9EU3RydWN0KSApOworCisgIFN0cmluZ0FuZEludCBzdHJpbmdBbmRJbnQwOworICBTdHJpbmdBbmRJbnQgc3RyaW5nQW5kSW50MTsKKyAgc3RyaW5nQW5kSW50MC5pID0gMDsKKyAgc3RyaW5nQW5kSW50MS5pID0gMTsKKyAgc3RyaW5nQW5kSW50MS5zID0gc3RkOjpzdHJpbmcoIjEiKTsKKyAgQk9PU1RfVEVTVCAoIHRlc3Qoc3RyaW5nQW5kSW50MCwgc3RyaW5nQW5kSW50MSkgKTsKKworICBTdHJ1Y3RXaXRoRGVzdHJ1Y3RvciBzdHJ1Y3RXaXRoRGVzdHJ1Y3RvcjA7CisgIFN0cnVjdFdpdGhEZXN0cnVjdG9yIHN0cnVjdFdpdGhEZXN0cnVjdG9yMTsKKyAgc3RydWN0V2l0aERlc3RydWN0b3IwLmkgPSAwOworICBzdHJ1Y3RXaXRoRGVzdHJ1Y3RvcjEuaSA9IDE7CisgIEJPT1NUX1RFU1QgKCB0ZXN0KHN0cnVjdFdpdGhEZXN0cnVjdG9yMCwgc3RydWN0V2l0aERlc3RydWN0b3IxKSApOworCisgIFN0cnVjdFdpdGhWaXJ0dWFsRnVuY3Rpb24gc3RydWN0V2l0aFZpcnR1YWxGdW5jdGlvbjA7CisgIFN0cnVjdFdpdGhWaXJ0dWFsRnVuY3Rpb24gc3RydWN0V2l0aFZpcnR1YWxGdW5jdGlvbjE7CisgIHN0cnVjdFdpdGhWaXJ0dWFsRnVuY3Rpb24wLmkgPSAwOworICBzdHJ1Y3RXaXRoVmlydHVhbEZ1bmN0aW9uMS5pID0gMTsKKyAgQk9PU1RfVEVTVCAoIHRlc3Qoc3RydWN0V2l0aFZpcnR1YWxGdW5jdGlvbjAsIHN0cnVjdFdpdGhWaXJ0dWFsRnVuY3Rpb24xKSApOworCisgIERlcml2ZWRGcm9tQWdncmVnYXRlUE9EU3RydWN0IGRlcml2ZWRGcm9tQWdncmVnYXRlUE9EU3RydWN0MDsKKyAgRGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QgZGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QxOworICBzdGF0aWNfY2FzdDxBZ2dyZWdhdGVQT0RTdHJ1Y3QgJj4oZGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QwKSA9IHplcm9Jbml0aWFsaXplZEFnZ3JlZ2F0ZVBPRFN0cnVjdDsKKyAgc3RhdGljX2Nhc3Q8QWdncmVnYXRlUE9EU3RydWN0ICY+KGRlcml2ZWRGcm9tQWdncmVnYXRlUE9EU3RydWN0MSkgPSBub25aZXJvSW5pdGlhbGl6ZWRBZ2dyZWdhdGVQT0RTdHJ1Y3Q7CisgIEJPT1NUX1RFU1QgKCB0ZXN0KGRlcml2ZWRGcm9tQWdncmVnYXRlUE9EU3RydWN0MCwgZGVyaXZlZEZyb21BZ2dyZWdhdGVQT0RTdHJ1Y3QxKSApOworCisgIEFnZ3JlZ2F0ZVBPRFN0cnVjdFdyYXBwZXIgYWdncmVnYXRlUE9EU3RydWN0V3JhcHBlcjA7CisgIEFnZ3JlZ2F0ZVBPRFN0cnVjdFdyYXBwZXIgYWdncmVnYXRlUE9EU3RydWN0V3JhcHBlcjE7CisgIGFnZ3JlZ2F0ZVBPRFN0cnVjdFdyYXBwZXIwLmRhdGFNZW1iZXIgPSB6ZXJvSW5pdGlhbGl6ZWRBZ2dyZWdhdGVQT0RTdHJ1Y3Q7CisgIGFnZ3JlZ2F0ZVBPRFN0cnVjdFdyYXBwZXIxLmRhdGFNZW1iZXIgPSBub25aZXJvSW5pdGlhbGl6ZWRBZ2dyZWdhdGVQT0RTdHJ1Y3Q7CisgIEJPT1NUX1RFU1QgKCB0ZXN0KGFnZ3JlZ2F0ZVBPRFN0cnVjdFdyYXBwZXIwLCBhZ2dyZWdhdGVQT0RTdHJ1Y3RXcmFwcGVyMSkgKTsKKworICBBcnJheU9mQnl0ZXMgemVyb0luaXRpYWxpemVkQXJyYXlPZkJ5dGVzID0geyAwIH07CisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxBcnJheU9mQnl0ZXM+IHZhbHVlSW5pdGlhbGl6ZWRBcnJheU9mQnl0ZXM7CisgIEJPT1NUX1RFU1QgKHN0ZDo6bWVtY21wKGdldCh2YWx1ZUluaXRpYWxpemVkQXJyYXlPZkJ5dGVzKSwgemVyb0luaXRpYWxpemVkQXJyYXlPZkJ5dGVzLCBzaXplb2YoQXJyYXlPZkJ5dGVzKSkgPT0gMCk7CisKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPEFycmF5T2ZCeXRlcz4gdmFsdWVJbml0aWFsaXplZEFycmF5T2ZCeXRlczI7CisgIHZhbHVlSW5pdGlhbGl6ZWRBcnJheU9mQnl0ZXMyID0gdmFsdWVJbml0aWFsaXplZEFycmF5T2ZCeXRlczsKKyAgQk9PU1RfVEVTVCAoc3RkOjptZW1jbXAoZ2V0KHZhbHVlSW5pdGlhbGl6ZWRBcnJheU9mQnl0ZXMpLCBnZXQodmFsdWVJbml0aWFsaXplZEFycmF5T2ZCeXRlczIpLCBzaXplb2YoQXJyYXlPZkJ5dGVzKSkgPT0gMCk7CisKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPENvcHlGdW5jdGlvbkNhbGxUZXN0ZXI+IGNvcHlGdW5jdGlvbkNhbGxUZXN0ZXIxOworICBCT09TVF9URVNUICggISBnZXQoY29weUZ1bmN0aW9uQ2FsbFRlc3RlcjEpLmlzX2NvcHlfY29uc3RydWN0ZWQpOworICBCT09TVF9URVNUICggISBnZXQoY29weUZ1bmN0aW9uQ2FsbFRlc3RlcjEpLmlzX2Fzc2lnbm1lbnRfY2FsbGVkKTsKKworICBib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8Q29weUZ1bmN0aW9uQ2FsbFRlc3Rlcj4gY29weUZ1bmN0aW9uQ2FsbFRlc3RlcjIgPSBib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8Q29weUZ1bmN0aW9uQ2FsbFRlc3Rlcj4oY29weUZ1bmN0aW9uQ2FsbFRlc3RlcjEpOworICBCT09TVF9URVNUICggZ2V0KGNvcHlGdW5jdGlvbkNhbGxUZXN0ZXIyKS5pc19jb3B5X2NvbnN0cnVjdGVkKTsKKyAgQk9PU1RfVEVTVCAoICEgZ2V0KGNvcHlGdW5jdGlvbkNhbGxUZXN0ZXIyKS5pc19hc3NpZ25tZW50X2NhbGxlZCk7CisKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPENvcHlGdW5jdGlvbkNhbGxUZXN0ZXI+IGNvcHlGdW5jdGlvbkNhbGxUZXN0ZXIzOworICBjb3B5RnVuY3Rpb25DYWxsVGVzdGVyMyA9IGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxDb3B5RnVuY3Rpb25DYWxsVGVzdGVyPihjb3B5RnVuY3Rpb25DYWxsVGVzdGVyMSk7CisgIEJPT1NUX1RFU1QgKCAhIGdldChjb3B5RnVuY3Rpb25DYWxsVGVzdGVyMykuaXNfY29weV9jb25zdHJ1Y3RlZCk7CisgIEJPT1NUX1RFU1QgKCBnZXQoY29weUZ1bmN0aW9uQ2FsbFRlc3RlcjMpLmlzX2Fzc2lnbm1lbnRfY2FsbGVkKTsKKworICBib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8U3dhcEZ1bmN0aW9uQ2FsbFRlc3Rlcj4gc3dhcEZ1bmN0aW9uQ2FsbFRlc3RlcjE7CisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxTd2FwRnVuY3Rpb25DYWxsVGVzdGVyPiBzd2FwRnVuY3Rpb25DYWxsVGVzdGVyMjsKKyAgZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIxKS5kYXRhID0gMTsKKyAgZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIyKS5kYXRhID0gMjsKKyAgYm9vc3Q6OnN3YXAoc3dhcEZ1bmN0aW9uQ2FsbFRlc3RlcjEsIHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIyKTsKKyAgQk9PU1RfVEVTVCggZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIxKS5kYXRhID09IDIgKTsKKyAgQk9PU1RfVEVTVCggZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIyKS5kYXRhID09IDEgKTsKKyAgQk9PU1RfVEVTVCggZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIxKS5pc19jdXN0b21fc3dhcF9jYWxsZWQgKTsKKyAgQk9PU1RfVEVTVCggZ2V0KHN3YXBGdW5jdGlvbkNhbGxUZXN0ZXIyKS5pc19jdXN0b21fc3dhcF9jYWxsZWQgKTsKKworICByZXR1cm4gYm9vc3Q6OnJlcG9ydF9lcnJvcnMoKTsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0L3ZhbHVlX2luaXRfdGVzdF9mYWlsMS5jcHAgYi90ZXN0L3ZhbHVlX2luaXRfdGVzdF9mYWlsMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5ZTZiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmFsdWVfaW5pdF90ZXN0X2ZhaWwxLmNwcApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAwMiwgRmVybmFuZG8gTHVpcyBDYWNjaW9sYSBDYXJiYWxsYWwuCisvLworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8KKy8vIFRlc3QgcHJvZ3JhbSBmb3IgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisvLworLy8gSW5pdGlhbDogMjEgQWd1IDIwMDIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisKK2ludCBtYWluKCkKK3sKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPGludD4gY29uc3QgeF9jIDsKKworICBnZXQoeF9jKSA9IDEyMzQgOyAvLyB0aGlzIHNob3VsZCBwcm9kdWNlIGFuIEVSUk9SCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3ZhbHVlX2luaXRfdGVzdF9mYWlsMi5jcHAgYi90ZXN0L3ZhbHVlX2luaXRfdGVzdF9mYWlsMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyYTJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdmFsdWVfaW5pdF90ZXN0X2ZhaWwyLmNwcApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAwMiwgRmVybmFuZG8gTHVpcyBDYWNjaW9sYSBDYXJiYWxsYWwuCisvLworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlCisvLyBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAorLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorLy8KKy8vIFRlc3QgcHJvZ3JhbSBmb3IgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisvLworLy8gSW5pdGlhbDogMjEgQWd1IDIwMDIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHAiCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyNwcmFnbWEgaGRyc3RvcAorI2VuZGlmCisKK2ludCBtYWluKCkKK3sKKyAgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPGludCBjb25zdD4gY3ggOworCisgIGdldChjeCkgPSAxMjM0IDsgLy8gdGhpcyBzaG91bGQgcHJvZHVjZSBhbiBFUlJPUgorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdC92YWx1ZV9pbml0X3Rlc3RfZmFpbDMuY3BwIGIvdGVzdC92YWx1ZV9pbml0X3Rlc3RfZmFpbDMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDFmODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZhbHVlX2luaXRfdGVzdF9mYWlsMy5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMDIsIEZlcm5hbmRvIEx1aXMgQ2FjY2lvbGEgQ2FyYmFsbGFsLgorLy8KKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQorLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKKy8vIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKKy8vCisvLyBUZXN0IHByb2dyYW0gZm9yICJib29zdC91dGlsaXR5L3ZhbHVlX2luaXQuaHBwIgorLy8KKy8vIEluaXRpYWw6IDIxIEFndSAyMDAyCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJib29zdC91dGlsaXR5L3ZhbHVlX2luaXQuaHBwIgorCisjaWZkZWYgX19CT1JMQU5EQ19fCisjcHJhZ21hIGhkcnN0b3AKKyNlbmRpZgorCitpbnQgbWFpbigpCit7CisgIGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxpbnQgY29uc3Q+IGNvbnN0IGN4X2MgOworCisgIGdldChjeF9jKSA9IDEyMzQgOyAvLyB0aGlzIHNob3VsZCBwcm9kdWNlIGFuIEVSUk9SCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L3ZhbHVlX2luaXRfd29ya2Fyb3VuZF90ZXN0LmNwcCBiL3Rlc3QvdmFsdWVfaW5pdF93b3JrYXJvdW5kX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZhbHVlX2luaXRfd29ya2Fyb3VuZF90ZXN0LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTAsIE5pZWxzIERla2tlci4KKy8vCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKy8vIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisvLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisvLworLy8gVGVzdCBwcm9ncmFtIGZvciB0aGUgYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPFQ+IHdvcmthcm91bmQuCisvLworLy8gMTcgSnVuZSAyMDEwIChDcmVhdGVkKSBOaWVscyBEZWtrZXIKKworLy8gU3dpdGNoIHRoZSB3b3JrYXJvdW5kIG9mZiwgYmVmb3JlIGlubHVkaW5nICJ2YWx1ZV9pbml0LmhwcCIuCisjZGVmaW5lIEJPT1NUX0RFVEFJTF9WQUxVRV9JTklUX1dPUktBUk9VTkQgMAorI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvdmFsdWVfaW5pdC5ocHA+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4gIC8vIEZvciBjb3V0LgorI2luY2x1ZGUgPGNzdGRsaWI+ICAvLyBGb3IgRVhJVF9TVUNDRVNTIGFuZCBFWElUX0ZBSUxVUkUuCisKK25hbWVzcGFjZQoreworICBzdHJ1Y3QgZW1wdHlfc3RydWN0CisgIHsKKyAgfTsKKworICAvLyBBIFBPRCBhZ2dyZWdhdGUgc3RydWN0IGRlcml2ZWQgZnJvbSBhbiBlbXB0eSBzdHJ1Y3QuCisgIC8vIFNpbWlsYXIgdG8gc3RydWN0IEZvbzEgZnJvbSBNaWNyb3NvZnQgVmlzdWFsIEMrKyBidWcgcmVwb3J0IDQ4NDI5NSwKKyAgLy8gIlZDKysgZG9lcyBub3QgdmFsdWUtaW5pdGlhbGl6ZSBtZW1iZXJzIG9mIGRlcml2ZWQgY2xhc3NlcyB3aXRob3V0IAorICAvLyB1c2VyLWRlY2xhcmVkIGNvbnN0cnVjdG9yIiwgcmVwb3J0ZWQgaW4gMjAwOSBieSBTeWx2ZXN0ZXIgSGVzcDoKKyAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvNDg0Mjk1CisgIHN0cnVjdCBkZXJpdmVkX3N0cnVjdDogZW1wdHlfc3RydWN0CisgIHsKKyAgICBpbnQgZGF0YTsKKyAgfTsKKworICBib29sIGlzX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IGRlcml2ZWRfc3RydWN0JiBhcmcpCisgIHsKKyAgICByZXR1cm4gYXJnLmRhdGEgPT0gMDsKKyAgfQorCisKKyAgY2xhc3MgdmlydHVhbF9kZXN0cnVjdG9yX2hvbGRlcgorICB7CisgIHB1YmxpYzoKKyAgICBpbnQgaTsKKyAgICB2aXJ0dWFsIH52aXJ0dWFsX2Rlc3RydWN0b3JfaG9sZGVyKCkKKyAgICB7CisgICAgfQorICB9OworCisgIGJvb2wgaXNfdmFsdWVfaW5pdGlhbGl6ZWQoY29uc3QgdmlydHVhbF9kZXN0cnVjdG9yX2hvbGRlciYgYXJnKQorICB7CisgICAgcmV0dXJuIGFyZy5pID09IDA7CisgIH0KKworICAvLyBFcXVpdmFsZW50IHRvIHRoZSBTdGF0cyBjbGFzcyBmcm9tIEdDQyBCdWcgMzM5MTYsCisgIC8vICJEZWZhdWx0IGNvbnN0cnVjdG9yIGZhaWxzIHRvIGluaXRpYWxpemUgYXJyYXkgbWVtYmVycyIsIHJlcG9ydGVkIGluIDIwMDcgYnkKKyAgLy8gTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW46IGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzM5MTYKKyAgLy8gYW5kIGZpeGVkIGZvciBHQ0MgNC4yLjQuCisgIGNsYXNzIHByaXZhdGVfaW50X2FycmF5X3BhaXIKKyAgeworICAgIGZyaWVuZCBib29sIGlzX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IHByaXZhdGVfaW50X2FycmF5X3BhaXImIGFyZyk7CisgIHByaXZhdGU6CisgICAgaW50IGZpcnN0WzEyXTsKKyAgICBpbnQgc2Vjb25kWzEyXTsKKyAgfTsKKworICBib29sIGlzX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IHByaXZhdGVfaW50X2FycmF5X3BhaXImIGFyZykKKyAgeworICAgIGZvciAoIHVuc2lnbmVkIGkgPSAwOyBpIDwgMTI7ICsraSkKKyAgICB7CisgICAgICBpZiAoIChhcmcuZmlyc3RbaV0gIT0gMCkgfHwgKGFyZy5zZWNvbmRbaV0gIT0gMCkgKQorICAgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RydWN0IGludF9wYWlyX3N0cnVjdAorICB7CisgICAgaW50IGZpcnN0OworICAgIGludCBzZWNvbmQ7CisgIH07CisKKyAgdHlwZWRlZiBpbnQgaW50X3BhaXJfc3RydWN0OjoqcHRyX3RvX21lbWJlcl90eXBlOworCisgIHN0cnVjdCBwdHJfdG9fbWVtYmVyX3N0cnVjdAorICB7CisgICAgcHRyX3RvX21lbWJlcl90eXBlIGRhdGE7CisgIH07CisKKyAgYm9vbCBpc192YWx1ZV9pbml0aWFsaXplZChjb25zdCBwdHJfdG9fbWVtYmVyX3N0cnVjdCYgYXJnKQorICB7CisgICAgcmV0dXJuIGFyZy5kYXRhID09IDA7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBpc192YWx1ZV9pbml0aWFsaXplZChjb25zdCBUKCYgYXJnKVsyXSkKKyAgeworICAgIHJldHVybgorICAgICAgaXNfdmFsdWVfaW5pdGlhbGl6ZWQoYXJnWzBdKSAmJgorICAgICAgaXNfdmFsdWVfaW5pdGlhbGl6ZWQoYXJnWzFdKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIGlzX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxUPiYgYXJnKQorICB7CisgICAgcmV0dXJuIGlzX3ZhbHVlX2luaXRpYWxpemVkKGFyZy5kYXRhKCkpOworICB9CisKKyAgLy8gUmV0dXJucyB6ZXJvIHdoZW4gdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgdmFsdWUtaW5pdGlhbGl6YXRlZCwgYW5kIG9uZSBvdGhlcndpc2UuCisgIC8vIFByaW50cyBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGlmIHRoZSB2YWx1ZS1pbml0aWFsaXphdGlvbiBoYXMgZmFpbGVkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgdW5zaWduZWQgZmFpbGVkX3RvX3ZhbHVlX2luaXRpYWxpemVkKGNvbnN0IFQmIG9iamVjdCwgY29uc3QgY2hhciAqY29uc3Qgb2JqZWN0X25hbWUpCisgIHsKKyAgICBpZiAoIGlzX3ZhbHVlX2luaXRpYWxpemVkKG9iamVjdCkgKQorICAgIHsKKyAgICAgIHJldHVybiAwdTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHN0ZDo6Y291dCA8PCAiTm90ZTogRmFpbGVkIHRvIHZhbHVlLWluaXRpYWxpemUgIiA8PCBvYmplY3RfbmFtZSA8PCAnLicgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDF1OworICAgIH0KKyAgfQorCisvLyBBIG1hY3JvIHRoYXQgcGFzc2VkIGJvdGggdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCB0bworLy8gdGhlIGZ1bmN0aW9uIGFib3ZlIGhlcmUuCisjZGVmaW5lIEZBSUxFRF9UT19WQUxVRV9JTklUSUFMSVpFKHZhbHVlKSBmYWlsZWRfdG9fdmFsdWVfaW5pdGlhbGl6ZWQodmFsdWUsICN2YWx1ZSkKKworICAvLyBFcXVpdmFsZW50IHRvIHRoZSBkaXJ0eV9zdGFjaygpIGZ1bmN0aW9uIGZyb20gR0NDIEJ1ZyAzMzkxNiwKKyAgLy8gIkRlZmF1bHQgY29uc3RydWN0b3IgZmFpbHMgdG8gaW5pdGlhbGl6ZSBhcnJheSBtZW1iZXJzIiwgcmVwb3J0ZWQgaW4gMjAwNyBieQorICAvLyBNaWNoYWVsIEVsaXphYmV0aCBDaGFzdGFpbjogaHR0cDovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMzkxNgorICB2b2lkIGRpcnR5X3N0YWNrKCkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIgYXJyYXlfb25fc3RhY2tbNDA5Nl07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZihhcnJheV9vbl9zdGFjayk7ICsraSkKKyAgICB7CisgICAgICBhcnJheV9vbl9zdGFja1tpXSA9IDB4MTE7CisgICAgfQorICB9CisKK30KKworCitpbnQgbWFpbigpCit7CisgIGRpcnR5X3N0YWNrKCk7CisKKyAgLy8gVE9ETyBNb3JlIHR5cGVzIG1heSBiZSBhZGRlZCBsYXRlci4KKyAgY29uc3QgdW5zaWduZWQgbnVtX2ZhaWx1cmVzID0KKyAgICBGQUlMRURfVE9fVkFMVUVfSU5JVElBTElaRShib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8ZGVyaXZlZF9zdHJ1Y3Q+KCkpICsKKyAgICBGQUlMRURfVE9fVkFMVUVfSU5JVElBTElaRShib29zdDo6dmFsdWVfaW5pdGlhbGl6ZWQ8dmlydHVhbF9kZXN0cnVjdG9yX2hvbGRlclsyXT4oKSkgKworICAgIEZBSUxFRF9UT19WQUxVRV9JTklUSUFMSVpFKGJvb3N0Ojp2YWx1ZV9pbml0aWFsaXplZDxwcml2YXRlX2ludF9hcnJheV9wYWlyPigpKSArCisgICAgRkFJTEVEX1RPX1ZBTFVFX0lOSVRJQUxJWkUoYm9vc3Q6OnZhbHVlX2luaXRpYWxpemVkPHB0cl90b19tZW1iZXJfc3RydWN0PigpKTsKKworI2lmZGVmIEJPT1NUX0RFVEFJTF9WQUxVRV9JTklUX1dPUktBUk9VTkRfU1VHR0VTVEVECisgIC8vIE9uZSBvciBtb3JlIGZhaWx1cmVzIGFyZSBleHBlY3RlZC4KKyAgcmV0dXJuIG51bV9mYWlsdXJlcyA+IDAgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7CisjZWxzZQorICAvLyBObyBmYWlsdXJlcyBhcmUgZXhwZWN0ZWQuCisgIHJldHVybiBudW1fZmFpbHVyZXMgPT0gMCA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdGhyb3dfZXhjZXB0aW9uLmh0bWwgYi90aHJvd19leGNlcHRpb24uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDFmNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhyb3dfZXhjZXB0aW9uLmh0bWwKQEAgLTAsMCArMSwxNSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj1yZWZyZXNoIGNvbnRlbnQ9IjA7IFVSTD0uLi9leGNlcHRpb24vZG9jL3Rocm93X2V4Y2VwdGlvbi5odG1sIj4KKzx0aXRsZT5BdXRvbWF0aWMgcmVkaXJlY3Rpb248L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CitBdXRvbWF0aWMgcmVkaXJlY3Rpb24gZmFpbGVkLCBwbGVhc2UgZ28gdG8KKzxhIGhyZWY9Ii4uL2V4Y2VwdGlvbi9kb2MvdGhyb3dfZXhjZXB0aW9uLmh0bWwiPnRocm93X2V4Y2VwdGlvbi5odG1sPC9hPi4mbmJzcDs8aHI+Cis8cD6pIENvcHlyaWdodCBCZW1hbiBEYXdlcywgMjAwMTwvcD4KKzxwPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgCitmaWxlIDxhIGhyZWY9Ii4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+TElDRU5TRV8xXzAudHh0PC9hPiBvciBjb3B5IAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXRpbGl0eS5odG0gYi91dGlsaXR5Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFiNThjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbGl0eS5odG0KQEAgLTAsMCArMSw1ODMgQEAKKzxodG1sPgorCTxoZWFkPgorCQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKwkJPHRpdGxlPkhlYWRlciBib29zdC91dGlsaXR5LmhwcCBEb2N1bWVudGF0aW9uPC90aXRsZT4KKwk8L2hlYWQ+CisJPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCI+CisJCTxoMT48aW1nIHNyYz0iLi4vLi4vYm9vc3QucG5nIiBhbHQ9ImJvb3N0LnBuZyAoNjg5NyBieXRlcykiIGFsaWduPSJjZW50ZXIiIFdJRFRIPSIyNzciIEhFSUdIVD0iODYiPkhlYWRlcgorCQkJPGEgaHJlZj0iLi4vLi4vYm9vc3QvdXRpbGl0eS5ocHAiPmJvb3N0L3V0aWxpdHkuaHBwPC9hPjwvaDE+CisJCTxwPlRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGhlYWRlciA8Y29kZT48YSBocmVmPSIuLi8uLi9ib29zdC91dGlsaXR5LmhwcCI+Jmx0O2Jvb3N0L3V0aWxpdHkuaHBwJmd0OzwvYT48L2NvZGU+CisJCQlhcmUgaW4gPGNvZGU+bmFtZXNwYWNlIGJvb3N0PC9jb2RlPi48L3A+CisJCTxoMj5Db250ZW50czwvaDI+CisJCTx1bD4KKwkJCTxsaT4KKwkJCQlDbGFzcyB0ZW1wbGF0ZXMgc3VwcG9ydGluZyB0aGUgPGEgaHJlZj0iZG9jL2h0bWwvYmFzZV9mcm9tX21lbWJlci5odG1sIj4KKwkJCQkJYmFzZS1mcm9tLW1lbWJlciBpZGlvbTwvYT48L2xpPgorCQkJPGxpPgorCQkJCUZ1bmN0aW9uIHRlbXBsYXRlcyA8YSBocmVmPSIuLi9jb3JlL2RvYy9odG1sL2NvcmUvY2hlY2tlZF9kZWxldGUuaHRtbCI+Y2hlY2tlZF9kZWxldGUoKSBhbmQgCisJCQkJCWNoZWNrZWRfYXJyYXlfZGVsZXRlKCk8L2E+IChtb3ZlZCB0byB0aGUgQm9vc3QuQ29yZSBsaWJyYXJ5KTwvbGk+CisJCQk8bGk+CisJCQkJRnVuY3Rpb24gdGVtcGxhdGVzIDxhIGhyZWY9Ii4uL2l0ZXJhdG9yL2RvYy9odG1sL2l0ZXJhdG9yL2FsZ29yaXRobXMvbmV4dF9wcmlvci5odG1sIj5uZXh0KCkgYW5kIHByaW9yKCk8L2E+IChtb3ZlZCB0byB0aGUgQm9vc3QuSXRlcmF0b3IgbGlicmFyeSk8L2xpPgorCQkJPGxpPgorCQkJCUNsYXNzIDxhIGhyZWY9Ii4uL2NvcmUvZG9jL2h0bWwvY29yZS9ub25jb3B5YWJsZS5odG1sIj5ub25jb3B5YWJsZTwvYT4gKG1vdmVkIHRvIHRoZSBCb29zdC5Db3JlIGxpYnJhcnkpPC9saT4KKwkJCTxsaT4KKwkJCQlGdW5jdGlvbiB0ZW1wbGF0ZSA8YSBocmVmPSIuLi9jb3JlL2RvYy9odG1sL2NvcmUvYWRkcmVzc29mLmh0bWwiPmFkZHJlc3NvZigpPC9hPiAobW92ZWQgdG8gdGhlIEJvb3N0LkNvcmUgbGlicmFyeSk8L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkNsYXNzIHRlbXBsYXRlIDxhIGhyZWY9IiNyZXN1bHRfb2YiPnJlc3VsdF9vZjwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgorCQkJCU1hY3JvIDxhIGhyZWY9IiNCT09TVF9CSU5BUlkiPkJPT1NUX0JJTkFSWTwvYT48L2xpPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImluZGV4Lmh0bWwiPk90aGVyIHV0aWxpdGllcyBub3QgcGFydCBvZiA8Y29kZT51dGlsaXR5LmhwcDwvY29kZT48L2E+PC9saT4KKwkJPC91bD4KKwkJPGgyPgorCisgICAgICAgICAgICAgICAgPGgyPjxhIG5hbWU9InJlc3VsdF9vZiI+Q2xhc3MgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICByZXN1bHRfb2Y8L2E+PC9oMj4gPHA+VGhlIGNsYXNzIHRlbXBsYXRlCisgICAgICAgICAgICAgICAgPGNvZGU+cmVzdWx0X29mPC9jb2RlPiBoZWxwcyBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYQorICAgICAgICAgICAgICAgIGNhbGwgZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGUsIGdpdmVuIGFuIGx2YWx1ZSA8Y29kZT5mPC9jb2RlPiBvZgorICAgICAgICAgICAgICAgIHR5cGUgPGNvZGU+RjwvY29kZT4gYW5kIGx2YWx1ZXMgPGNvZGU+dDE8L2NvZGU+LAorICAgICAgICAgICAgICAgIDxjb2RlPnQyPC9jb2RlPiwgLi4uLCA8Y29kZT50PGVtPk48L2VtPjwvY29kZT4gb2YKKyAgICAgICAgICAgICAgICB0eXBlcyA8Y29kZT5UMTwvY29kZT4sIDxjb2RlPlQyPC9jb2RlPiwgLi4uLAorICAgICAgICAgICAgICAgIDxjb2RlPlQ8ZW0+TjwvZW0+PC9jb2RlPiwgcmVzcGVjdGl2ZWx5LCB0aGUgdHlwZQorICAgICAgICAgICAgICAgIDxjb2RlPnJlc3VsdF9vZiZsdDtGKFQxLCBUMiwgLi4uLAorICAgICAgICAgICAgICAgIFQ8ZW0+TjwvZW0+KSZndDs6OnR5cGU8L2NvZGU+IGRlZmluZXMgdGhlIHJlc3VsdCB0eXBlCisgICAgICAgICAgICAgICAgb2YgdGhlIGV4cHJlc3Npb24gPGNvZGU+Zih0MSwgdDIsCisgICAgICAgICAgICAgICAgLi4uLHQ8ZW0+TjwvZW0+KTwvY29kZT4uIFRoaXMgaW1wbGVtZW50YXRpb24gcGVybWl0cworICAgICAgICAgICAgICAgIHRoZSB0eXBlIDxjb2RlPkY8L2NvZGU+IHRvIGJlIGEgZnVuY3Rpb24gcG9pbnRlciwKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiByZWZlcmVuY2UsIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyLCBvciBjbGFzcworICAgICAgICAgICAgICAgIHR5cGUuIEJ5IGRlZmF1bHQsIDxlbT5OPC9lbT4gbWF5IGJlIGFueSB2YWx1ZSBiZXR3ZWVuIDAgYW5kCisgICAgICAgICAgICAgICAgMTYuIFRvIGNoYW5nZSB0aGUgdXBwZXIgbGltaXQsIGRlZmluZSB0aGUgbWFjcm8KKyAgICAgICAgICAgICAgICA8Y29kZT5CT09TVF9SRVNVTFRfT0ZfTlVNX0FSR1M8L2NvZGU+IHRvIHRoZSBtYXhpbXVtCisgICAgICAgICAgICAgICAgdmFsdWUgZm9yIDxlbT5OPC9lbT4uIENsYXNzIHRlbXBsYXRlIDxjb2RlPnJlc3VsdF9vZjwvY29kZT4KKyAgICAgICAgICAgICAgICByZXNpZGVzIGluIHRoZSBoZWFkZXIgPGNvZGU+Jmx0OzxhCisgICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vYm9vc3QvdXRpbGl0eS9yZXN1bHRfb2YuaHBwIj5ib29zdC91dGlsaXR5L3Jlc3VsdF9vZi5ocHA8L2E+Jmd0OzwvY29kZT4uPC9wPgorCisgICAgICAgICAgICAgICAgPHA+SWYgeW91ciBjb21waWxlcidzIHN1cHBvcnQgZm9yIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBpcworICAgICAgICAgICAgICAgIGFkZXF1YXRlLCA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+IGF1dG9tYXRpY2FsbHkgdXNlcyBpdCB0bworICAgICAgICAgICAgICAgIGRlZHVjZSB0aGUgdHlwZSBvZiB0aGUgY2FsbCBleHByZXNzaW9uLCBpbiB3aGljaCBjYXNlCisgICAgICAgICAgICAgICAgPGNvZGU+cmVzdWx0X29mJmx0O0YoVDEsIFQyLCAuLi4sCisgICAgICAgICAgICAgICAgVDxlbT5OPC9lbT4pJmd0Ozo6dHlwZTwvY29kZT4gbmFtZXMgdGhlIHR5cGUKKyAgICAgICAgICAgICAgICA8Y29kZT5kZWNsdHlwZShib29zdDo6ZGVjbHZhbCZsdDtGJmd0OygpKGJvb3N0OjpkZWNsdmFsJmx0O1QxJmd0OygpLAorICAgICAgICAgICAgICAgIGJvb3N0OjpkZWNsdmFsJmx0O1QyJmd0OygpLCAuLi4sCisgICAgICAgICAgICAgICAgYm9vc3Q6OmRlY2x2YWwmbHQ7VDxlbT5OPC9lbT4mZ3Q7KCkpKTwvY29kZT4sIGFzIGluIHRoZQorICAgICAgICAgICAgICAgIGZvbGxvd2luZyBleGFtcGxlLjwvcD4KKworICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICAgICAgICAgIDxwcmU+c3RydWN0IGZ1bmN0b3IgeworICAgIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7CisgICAgVCBvcGVyYXRvcigpKFQgeCkKKyAgICB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KK307CisKK3R5cGVkZWYgYm9vc3Q6OnJlc3VsdF9vZiZsdDsKKyAgICBmdW5jdG9yKGludCkKKyZndDs6OnR5cGUgdHlwZTsgLy8gdHlwZSBpcyBpbnQ8L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Jsb2NrcXVvdGU+CisKKyAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHRlc3Qgd2hldGhlciA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+IGlzIHVzaW5nCisgICAgICAgICAgICAgICAgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+IGJ5IGNoZWNraW5nIGlmIHRoZSBtYWNybworICAgICAgICAgICAgICAgIDxjb2RlPkJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEU8L2NvZGU+IGlzIGRlZmluZWQgYWZ0ZXIKKyAgICAgICAgICAgICAgICBpbmNsdWRpbmcgPGNvZGU+cmVzdWx0X29mLmhwcDwvY29kZT4uIFlvdSBjYW4gYWxzbyBmb3JjZQorICAgICAgICAgICAgICAgIDxjb2RlPnJlc3VsdF9vZjwvY29kZT4gdG8gdXNlIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBieQorICAgICAgICAgICAgICAgIGRlZmluaW5nIDxjb2RlPkJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEU8L2NvZGU+IHByaW9yCisgICAgICAgICAgICAgICAgdG8gaW5jbHVkaW5nIDxjb2RlPnJlc3VsdF9vZi5ocHA8L2NvZGU+LjwvcD4KKworICAgICAgICAgICAgICAgIDxwPklmIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBpcyBub3QgdXNlZCwKKyAgICAgICAgICAgICAgICB0aGVuIGF1dG9tYXRpYyByZXN1bHQgdHlwZSBkZWR1Y3Rpb24gb2YgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBvYmplY3RzIGlzIG5vdCBwb3NzaWJsZS4gSW5zdGVhZCwgPGNvZGU+cmVzdWx0X29mPC9jb2RlPgorICAgICAgICAgICAgICAgIHVzZXMgdGhlIGZvbGxvd2luZyBwcm90b2NvbCB0byBhbGxvdyB0aGUgcHJvZ3JhbW1lciB0bworICAgICAgICAgICAgICAgIHNwZWNpZnkgYSB0eXBlLiBXaGVuIDxjb2RlPkY8L2NvZGU+IGlzIGEgY2xhc3MgdHlwZSB3aXRoIGEKKyAgICAgICAgICAgICAgICBtZW1iZXIgdHlwZSA8Y29kZT5yZXN1bHRfdHlwZTwvY29kZT4sCisgICAgICAgICAgICAgICAgPGNvZGU+cmVzdWx0X29mJmx0O0YoVDEsIFQyLCAuLi4sCisgICAgICAgICAgICAgICAgVDxlbT5OPC9lbT4pJmd0Ozo6dHlwZTwvY29kZT4gaXMKKyAgICAgICAgICAgICAgICA8Y29kZT5GOjpyZXN1bHRfdHlwZTwvY29kZT4uIFdoZW4gPGNvZGU+RjwvY29kZT4gZG9lcworICAgICAgICAgICAgICAgIG5vdCBjb250YWluIDxjb2RlPnJlc3VsdF90eXBlPC9jb2RlPiwKKyAgICAgICAgICAgICAgICA8Y29kZT5yZXN1bHRfb2YmbHQ7RihUMSwgVDIsIC4uLiwKKyAgICAgICAgICAgICAgICBUPGVtPk48L2VtPikmZ3Q7Ojp0eXBlPC9jb2RlPiBpcyA8Y29kZT5GOjpyZXN1bHQmbHQ7RihUMSwKKyAgICAgICAgICAgICAgICBUMiwgLi4uLCBUPGVtPk48L2VtPikmZ3Q7Ojp0eXBlPC9jb2RlPiB3aGVuCisgICAgICAgICAgICAgICAgPGNvZGU+PGVtPk48L2VtPiAmZ3Q7IDA8L2NvZGU+IG9yIDxjb2RlPnZvaWQ8L2NvZGU+CisgICAgICAgICAgICAgICAgd2hlbiA8Y29kZT48ZW0+TjwvZW0+ID0gMDwvY29kZT4uIE5vdGUgdGhhdCBpdCBpcyB0aGUKKyAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSBvZiB0aGUgcHJvZ3JhbW1lciB0byBlbnN1cmUgdGhhdAorICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9iamVjdHMgYWNjdXJhdGVseSBhZHZlcnRpc2UgdGhlaXIgcmVzdWx0CisgICAgICAgICAgICAgICAgdHlwZSB2aWEgdGhpcyBwcm90b2NvbCwgYXMgaW4gdGhlIGZvbGxvd2luZworICAgICAgICAgICAgICAgIGV4YW1wbGUuPC9wPgorCisgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgPHByZT5zdHJ1Y3QgZnVuY3RvciB7CisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MmZ3Q7IHN0cnVjdCByZXN1bHQ7CisKKyAgICB0ZW1wbGF0ZSZsdDtjbGFzcyBGLCBjbGFzcyBUJmd0OworICAgIHN0cnVjdCByZXN1bHQmbHQ7RihUKSZndDsgeworICAgICAgICB0eXBlZGVmIFQgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsKKyAgICBUIG9wZXJhdG9yKCkoVCB4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorfTsKKwordHlwZWRlZiBib29zdDo6cmVzdWx0X29mJmx0OworICAgIGZ1bmN0b3IoaW50KQorJmd0Ozo6dHlwZSB0eXBlOyAvLyB0eXBlIGlzIGludDwvcHJlPgorICAgICAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KKworICAgICAgICAgICAgICAgIDxwPlNpbmNlIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBpcyBhIG5ldyBsYW5ndWFnZQorICAgICAgICAgICAgICAgIGZlYXR1cmUgcmVjZW50bHkgc3RhbmRhcmRpemVkIGluIEMrKzExLAorICAgICAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICAgICAgICAgIHRvIGJlIHVzZWQgd2l0aCA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+LCBmb3IKKyAgICAgICAgICAgICAgICBtYXhpbXVtIHBvcnRhYmlsaXR5LCB5b3UgbWlnaHQgY29uc2lkZXIgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgdGhlIGFib3ZlIHByb3RvY29sIGV2ZW4gaWYgeW91ciBjb21waWxlciBoYXMKKyAgICAgICAgICAgICAgICBwcm9wZXIgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+IHN1cHBvcnQuIElmIHlvdSB3aXNoIHRvIGNvbnRpbnVlIHRvCisgICAgICAgICAgICAgICAgdXNlIHRoZSBwcm90b2NvbCBvbiBjb21waWxlcnMgdGhhdAorICAgICAgICAgICAgICAgIHN1cHBvcnQgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+LCB0aGVyZSBhcmUgdHdvIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgPGNvZGU+Ym9vc3Q6OnRyMV9yZXN1bHRfb2Y8L2NvZGU+LCB3aGljaCBpcyBhbHNvCisgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiA8Y29kZT4mbHQ7PGEgaHJlZj0iLi4vLi4vYm9vc3QvdXRpbGl0eS9yZXN1bHRfb2YuaHBwIj5ib29zdC91dGlsaXR5L3Jlc3VsdF9vZi5ocHA8L2E+Jmd0OzwvY29kZT4uCisgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkZWZpbmUgdGhlIG1hY3JvCisgICAgICAgICAgICAgICAgPGNvZGU+Qk9PU1RfUkVTVUxUX09GX1VTRV9UUjE8L2NvZGU+LCB3aGljaCBjYXVzZXMKKyAgICAgICAgICAgICAgICA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+IHRvIHVzZSB0aGUgcHJvdG9jb2wgZGVzY3JpYmVkCisgICAgICAgICAgICAgICAgYWJvdmUgaW5zdGVhZCBvZiA8Y29kZT5kZWNsdHlwZTwvY29kZT4uIElmIHlvdSBjaG9vc2UgdG8KKyAgICAgICAgICAgICAgICBmb2xsb3cgdGhlIHByb3RvY29sLCB0YWtlIGNhcmUgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgPGNvZGU+cmVzdWx0X3R5cGU8L2NvZGU+IGFuZAorICAgICAgICAgICAgICAgIDxjb2RlPnJlc3VsdCZsdDsmZ3Q7PC9jb2RlPiBtZW1iZXJzIGFjY3VyYXRlbHkKKyAgICAgICAgICAgICAgICByZXByZXNlbnQgdGhlIHJldHVybiB0eXBlIG9mCisgICAgICAgICAgICAgICAgPGNvZGU+b3BlcmF0b3IoKTwvY29kZT4gZ2l2ZW4gYSBjYWxsIGV4cHJlc3Npb24uPC9wPgorCisgICAgICAgICAgICAgICAgPHA+QWRkaXRpb25hbGx5LCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPgorICAgICAgICAgICAgICAgIHByb3ZpZGVzIGEgdGhpcmQgbW9kZSBvZiBvcGVyYXRpb24sIHdoaWNoIHNvbWUgdXNlcnMKKyAgICAgICAgICAgICAgICBtYXkgZmluZCBjb252ZW5pZW50LiBXaGVuCisgICAgICAgICAgICAgICAgPGNvZGU+Qk9PU1RfUkVTVUxUX09GX1VTRV9UUjFfV0lUSF9ERUNMVFlQRV9GQUxMQkFDSzwvY29kZT4KKyAgICAgICAgICAgICAgICBpcyBkZWZpbmVkLCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiBiZWhhdmVzIGFzCisgICAgICAgICAgICAgICAgZm9sbG93cy4gSWYgdGhlIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBtZW1iZXIKKyAgICAgICAgICAgICAgICB0eXBlIDxjb2RlPnJlc3VsdF90eXBlPC9jb2RlPiBvciBtZW1iZXIKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y29kZT5yZXN1bHQmbHQ7Jmd0OzwvY29kZT4sIHRoZW4KKyAgICAgICAgICAgICAgICA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiB3aWxsIHVzZSB0aGUgVFIxCisgICAgICAgICAgICAgICAgcHJvdG9jb2wuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgICA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiB3aWxsCisgICAgICAgICAgICAgICAgdXNlIDxjb2RlPmRlY2x0eXBlPC9jb2RlPi4gVXNpbmcgVFIxIHdpdGgKKyAgICAgICAgICAgICAgICBhIDxjb2RlPmRlY2x5dHBlPC9jb2RlPiBmYWxsYmFjayBtYXkgd29ya2Fyb3VuZAorICAgICAgICAgICAgICAgIGNlcnRhaW4gcHJvYmxlbXMgYXQgdGhlIGNvc3Qgb2YgcG9ydGFiaWxpdHkuIEZvcgorICAgICAgICAgICAgICAgIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICA8bGk+RGVmaWNpZW50IGNvbXBpbGVyOiBJZiB5b3VyIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXMgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gdG8gd29yaworICAgICAgICAgICAgICAgICAgICB3aXRoIGluY29tcGxldGUgcmV0dXJuIHR5cGVzIGJ1dCB5b3VyCisgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyJ3MgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgaW5jb21wbGV0ZSByZXR1cm4gdHlwZXMsIHRoZW4geW91CisgICAgICAgICAgICAgICAgICAgIGNhbiB1c2UgdGhlIFRSMSBwcm90b2NvbCBhcyBhIHdvcmthcm91bmQuIFN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgZm9yIGluY29tcGxldGUgcmV0dXJuIHR5cGVzIHdhcyBhZGRlZCBsYXRlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBDKysxMSBzdGFuZGFyZGl6YXRpb24gcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAoc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL2p0YzEvc2MyMi93ZzIxL2RvY3MvcGFwZXJzLzIwMTEvbjMyNzYucGRmIj5OMzI3NjwvYT4pCisgICAgICAgICAgICAgICAgICAgIGFuZCBpcyBub3QgaW1wbGVtZW50ZWQgYnkgc29tZSBjb21waWxlcnMuPC9saT4KKworICAgICAgICAgICAgICAgICAgICA8bGk+RGVmaWNpZW50IGxlZ2FjeSBjb2RlOiBJZiB5b3VyIGV4aXN0aW5nIFRSMQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvYmplY3QgYWR2ZXJ0aXNlcyBhIGRpZmZlcmVudCB0eXBlIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCByZXN1bHQgdHlwZSBkZWR1Y2VkCisgICAgICAgICAgICAgICAgICAgIGJ5IDxjb2RlPmRlY2x0eXBlPC9jb2RlPiwgdGhlbiB1c2luZyBUUjEgd2l0aCBhCisgICAgICAgICAgICAgICAgICAgIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBmYWxsYmFjayB3aWxsIGFsbG93IHlvdSB0bworICAgICAgICAgICAgICAgICAgICB3b3JrIHdpdGggYm90aCB5b3VyIGV4aXN0aW5nIFRSMSBmdW5jdGlvbiBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgIGFuZCBuZXcgQysrMTEgZnVuY3Rpb24gb2JqZWN0LiBUaGlzIHNpdHVhdGlvbgorICAgICAgICAgICAgICAgICAgICBjb3VsZCBvY2N1ciBpZiB5b3VyIGxlZ2FjeSBmdW5jdGlvbiBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgIG1pc3VzZWQgdGhlIFRSMSBwcm90b2NvbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCisgICAgICAgICAgICAgICAgICAgIGtub3duIDxhIGhyZWY9IiNyZXN1bHRfb2ZfdHIxX2RpZmYiPmRpZmZlcmVuY2VzPC9hPgorICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+IGFuZCBUUjEuPC9saT4KKyAgICAgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgICAgICAgPGEgbmFtZT0iQk9PU1RfTk9fUkVTVUxUX09GIj48L2E+CisgICAgICAgICAgICAgICAgPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+CisgICAgICAgICAgICAgICAgcmVxdWlyZXMgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiwgdGhlCisgICAgICAgICAgICAgICAgYWJpbGl0eSB0byBwYXJzZSBmdW5jdGlvbiB0eXBlcyBwcm9wZXJseSwgYW5kIHN1cHBvcnQKKyAgICAgICAgICAgICAgICBmb3IgU0ZJTkFFLiBJZiA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+IGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICBieSB5b3VyIGNvbXBpbGVyLCBpbmNsdWRpbmcgdGhlIGhlYWRlciAKKyAgICAgICAgICAgICAgICA8Y29kZT5ib29zdC91dGlsaXR5L3Jlc3VsdF9vZi5ocHA8L2NvZGU+IHdpbGwKKyAgICAgICAgICAgICAgICBkZWZpbmUgdGhlIG1hY3JvIDxjb2RlPkJPT1NUX05PX1JFU1VMVF9PRjwvY29kZT4uPC9wPgorCisgICAgICAgICAgICAgICAgPHA+Rm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBhYm91dCA8Y29kZT5yZXN1bHRfb2Y8L2NvZGU+LCBzZWUgdGhlIEMrKyBMaWJyYXJ5CisgICAgICAgICAgICAgICAgVGVjaG5pY2FsIFJlcG9ydCwKKyAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDA1L24xODM2LnBkZiI+TjE4MzY8L2E+LAorICAgICAgICAgICAgICAgIG9yLCBmb3IgbW90aXZhdGlvbiBhbmQgZGVzaWduIHJhdGlvbmFsZSwKKyAgICAgICAgICAgICAgICB0aGUgPGNvZGU+cmVzdWx0X29mPC9jb2RlPiA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL3BhcGVycy8yMDAzL24xNDU0Lmh0bWwiPnByb3Bvc2FsPC9hPi48L3A+CisKKyAgICAgICAgICAgICAgICA8YSBuYW1lPSJyZXN1bHRfb2ZfZ3VpZGVsaW5lcyI+CisgICAgICAgICAgICAgICAgPGgzPlVzYWdlIGd1aWRlbGluZXMgZm9yIGJvb3N0OjpyZXN1bHRfb2Y8L2gzPgorICAgICAgICAgICAgICAgIDwvYT4KKworICAgICAgICAgICAgICAgIDxwPlRoZSBmb2xsb3dpbmcgYXJlIGdlbmVyYWwgc3VnZ2VzdGlvbnMgYWJvdXQgd2hlbgorICAgICAgICAgICAgICAgIGFuZCBob3cgdG8gdXNlIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+LjwvcD4KKworICAgICAgICAgICAgICAgIDxvbD4KKyAgICAgICAgICAgICAgICA8bGk+IElmIHlvdSBhcmUgdGFyZ2V0aW5nIEMrKzExIGFuZCBhcmUgbm90IGNvbmNlcm5lZAorICAgICAgICAgICAgICAgIGFib3V0IHBvcnRhYmlsaXR5IHRvIG5vbi1jb21wbGlhbnQgY29tcGlsZXJzIG9yCisgICAgICAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkLCB0aGVuIHVzZQorICAgICAgICAgICAgICAgIDxjb2RlPnN0ZDo6cmVzdWx0X29mPC9jb2RlPi4gSWYgPGNvZGU+c3RkOjpyZXN1bHRfb2Y8L2NvZGU+CisgICAgICAgICAgICAgICAgbWVldHMgeW91ciBuZWVkcywgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBzdG9wIHVzaW5nCisgICAgICAgICAgICAgICAgaXQuPC9saT4KKworICAgICAgICAgICAgICAgIDxsaT4gSWYgeW91IGFyZSB0YXJnZXRpbmcgQysrMTEgYnV0IG1heSBwb3J0IHlvdXIgY29kZQorICAgICAgICAgICAgICAgIHRvIGxlZ2FjeSBjb21waWxlcnMgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUsIHRoZW4KKyAgICAgICAgICAgICAgICB1c2UgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gd2l0aAorICAgICAgICAgICAgICAgIDxjb2RlPmRlY2x0eXBlPC9jb2RlPi4gV2hlbiA8Y29kZT5kZWNsdHlwZTwvY29kZT4gaXMKKyAgICAgICAgICAgICAgICB1c2VkIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+CisgICAgICAgICAgICAgICAgYW5kIDxjb2RlPnN0ZDo6cmVzdWx0X29mPC9jb2RlPiBhcmUgdXN1YWxseQorICAgICAgICAgICAgICAgIGludGVyY2hhbmdlYWJsZS4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uCisgICAgICAgICAgICAgICAga25vd24gPGEgaHJlZj0iI3Jlc3VsdF9vZl9jeHgxMV9kaWZmIj5kaWZmZXJlbmNlczwvYT4KKyAgICAgICAgICAgICAgICBiZXR3ZWVuIGJvb3N0OjpyZXN1bHRfb2YgYW5kIEMrKzExIHJlc3VsdF9vZi48L2xpPgorCisgICAgICAgICAgICAgICAgPGxpPiBJZiBjb21waWxlciBwb3J0YWJpbGl0eSBpcyByZXF1aXJlZCwKKyAgICAgICAgICAgICAgICB1c2UgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gd2l0aCB0aGUgVFIxIHByb3RvY29sLjwvbGk+CisgICAgICAgICAgICAgICAgPC9vbD4KKworICAgICAgICAgICAgICAgIDxwPlJlZ2FyZGxlc3Mgb2YgaG93IHlvdQorICAgICAgICAgICAgICAgIGNvbmZpZ3VyZSA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiwgaXQgaXMKKyAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gYmVhciBpbiBtaW5kIHRoYXQgdGhlIHJldHVybiB0eXBlIG9mIGEKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiBpdHMgYXJndW1lbnRzLCBhbmQKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsbHksIHRoZSByZXR1cm4gdHlwZSBvZiBhIG1lbWJlciBmdW5jdGlvbiBtYXkKKyAgICAgICAgICAgICAgICBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZSBjdi1xdWFsaWZpY2F0aW9uIG9mIHRoZQorICAgICAgICAgICAgICAgIG9iamVjdC4gPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gbXVzdCBiZSBwYXNzZWQKKyAgICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGVseSBjdi1xdWFsaWZpZWQgdHlwZXMgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICBkZWR1Y2UgdGhlIGNvcnJlc3BvbmRpbmcgcmV0dXJuIHR5cGUuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgPHByZT5zdHJ1Y3QgZnVuY3RvciB7CisgICAgaW50JiBvcGVyYXRvcigpKGludCk7CisgICAgaW50IGNvbnN0JiBvcGVyYXRvcigpKGludCkgY29uc3Q7CisKKyAgICBmbG9hdCYgb3BlcmF0b3IoKShmbG9hdCYpOworICAgIGZsb2F0IGNvbnN0JiBvcGVyYXRvcigpKGZsb2F0IGNvbnN0Jik7Cit9OworCit0eXBlZGVmIGJvb3N0OjpyZXN1bHRfb2YmbHQ7CisgICAgZnVuY3RvcihpbnQpCismZ3Q7Ojp0eXBlIHR5cGUxOyAvLyB0eXBlMSBpcyBpbnQgJgorCit0eXBlZGVmIGJvb3N0OjpyZXN1bHRfb2YmbHQ7CisgICAgY29uc3QgZnVuY3RvcihpbnQpCismZ3Q7Ojp0eXBlIHR5cGUyOyAvLyB0eXBlMiBpcyBpbnQgY29uc3QgJgorCit0eXBlZGVmIGJvb3N0OjpyZXN1bHRfb2YmbHQ7CisgICAgZnVuY3RvcihmbG9hdCYpCismZ3Q7Ojp0eXBlIHR5cGUzOyAvLyB0eXBlMyBpcyBmbG9hdCAmCisKK3R5cGVkZWYgYm9vc3Q6OnJlc3VsdF9vZiZsdDsKKyAgICBmdW5jdG9yKGZsb2F0IGNvbnN0JikKKyZndDs6OnR5cGUgdHlwZTQ7IC8vIHR5cGU0IGlzIGZsb2F0IGNvbnN0ICY8L3ByZT4KKyAgICAgICAgICAgICAgICA8L2Jsb2NrcXVvdGU+CisKKyAgICAgICAgICAgICAgICA8YSBuYW1lPSJyZXN1bHRfb2ZfdHIxX3Byb3RvY29sX2d1aWRlbGluZXMiPgorICAgICAgICAgICAgICAgIDxoMz5Vc2FnZSBndWlkZWxpbmVzIGZvciB0aGUgVFIxIHJlc3VsdF9vZiBwcm90b2NvbDwvaDM+CisgICAgICAgICAgICAgICAgPC9hPgorCisgICAgICAgICAgICAgICAgPHA+T24gY29tcGxpYW50IEMrKzExCisgICAgICAgICAgICAgICAgY29tcGlsZXJzLCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiBjYW4KKyAgICAgICAgICAgICAgICB1c2UgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+IHRvIGRlZHVjZSB0aGUgdHlwZSBvZiBhbnkKKyAgICAgICAgICAgICAgICBjYWxsIGV4cHJlc3Npb24sIGluY2x1ZGluZyBjYWxscyB0byBmdW5jdGlvbgorICAgICAgICAgICAgICAgIG9iamVjdHMuIEhvd2V2ZXIsIG9uIHByZS1DKysxMSBjb21waWxlcnMgb3Igb24KKyAgICAgICAgICAgICAgICBjb21waWxlcnMgd2l0aG91dCBhZGVxdWF0ZSBkZWNsdHlwZSBzdXBwb3J0LAorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgc2NhZmZvbGRpbmcgaXMgbmVlZGVkIGZyb20gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBvYmplY3RzIGFzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIGZvbGxvd2luZyBhcmUKKyAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucyBhYm91dCBob3cgdG8gdXNlIHRoZSBUUjEgcHJvdG9jb2wuPC9wPgorCisgICAgICAgICAgICAgICAgPHVsPgorICAgICAgICAgICAgICAgICAgICA8bGk+V2hlbiB0aGUgcmV0dXJuIHR5cGUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCB0eXBlcyBvciB0aGUgY3YtcXVhbGlmaWNhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb2JqZWN0LCBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5lIDxjb2RlPnJlc3VsdF90eXBlPC9jb2RlPi4gVGhlcmUgaXMgbm8gbmVlZAorICAgICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIDxjb2RlPnJlc3VsdDwvY29kZT4gdGVtcGxhdGUgdW5sZXNzIHRoZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSB2YXJpZXMuPC9saT4KKworICAgICAgICAgICAgICAgICAgICA8bGk+VXNlIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQgdHlwZSB3aGVuIGRlZmluaW5nCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMuIFRoaXMgY2FuIGhlbHAgZW5zdXJlIHRoZQorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgcmV0dXJuIHR5cGUgZG9lcyBub3QgZ2V0IG91dCBvZiBzeW5jIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgdGhlIHByb3RvY29sIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgPHByZT5zdHJ1Y3QgZnVuY3RvciB7CisgICAgdHlwZWRlZiBpbnQgcmVzdWx0X3R5cGU7CisgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShpbnQpOworfTs8L3ByZT4KKyAgICAgICAgICAgICAgICAgICA8L2Jsb2NrcXVvdGU+IDwvbGk+CisKKyAgICAgICAgICAgICAgICAgICA8bGk+QWx3YXlzIHNwZWNpZnkgdGhlIDxjb2RlPnJlc3VsdDwvY29kZT4KKyAgICAgICAgICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBuZWFyIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICAgICAgPGNvZGU+b3BlcmF0b3IoKTwvY29kZT4gb3ZlcmxvYWQuIFRoaXMgY2FuIG1ha2UgaXQKKyAgICAgICAgICAgICAgICAgICBlYXNpZXIgdG8ga2VlcCB0aGUgc3BlY2lhbGl6YXRpb25zIGluIHN5bmMgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICBvdmVybG9hZHMuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgPHByZT5zdHJ1Y3QgZnVuY3RvciB7CisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MmZ3Q7IHN0cnVjdCByZXN1bHQ7CisKKyAgICB0ZW1wbGF0ZSZsdDtjbGFzcyBGJmd0OworICAgIHN0cnVjdCByZXN1bHQmbHQ7RihpbnQpJmd0OyB7CisgICAgICAgIHR5cGVkZWYgaW50JiB0eXBlOworICAgIH07CisgICAgcmVzdWx0Jmx0O2Z1bmN0b3IoaW50KSZndDs6OnR5cGUgb3BlcmF0b3IoKShpbnQpOworCisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgRiZndDsKKyAgICBzdHJ1Y3QgcmVzdWx0Jmx0O2NvbnN0IEYoaW50KSZndDsgeworICAgICAgICB0eXBlZGVmIGludCBjb25zdCYgdHlwZTsKKyAgICB9OworICAgIHJlc3VsdCZsdDtjb25zdCBmdW5jdG9yKGludCkmZ3Q7Ojp0eXBlIG9wZXJhdG9yKCkoaW50KSBjb25zdDsKK307PC9wcmU+CisgICAgICAgICAgICAgICAgICAgPC9ibG9ja3F1b3RlPiA8L2xpPgorCisgICAgICAgICAgICAgICAgICAgPGxpPlVzZSB0eXBlIHRyYW5zZm9ybWF0aW9ucyB0byBzaW1wbGlmeQorICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5yZXN1bHQ8L2NvZGU+IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLiBGb3IKKyAgICAgICAgICAgICAgICAgICBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZXMKKyAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIuLi90eXBlX3RyYWl0cy9kb2MvaHRtbC9pbmRleC5odG1sIj5Cb29zdC5UeXBlVHJhaXRzPC9hPgorICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpYWxpemUgdGhlIDxjb2RlPnJlc3VsdDwvY29kZT4gdGVtcGxhdGUgZm9yCisgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgPGNvZGU+b3BlcmF0b3IoKTwvY29kZT4gdGhhdCBjYW4gYmUgY2FsbGVkIG9uCisgICAgICAgICAgICAgICAgICAgYm90aCBhIGNvbnN0IGFuZCBub24tY29uc3QgZnVuY3Rpb24gb2JqZWN0IHdpdGgKKyAgICAgICAgICAgICAgICAgICBlaXRoZXIgYW4gbHZhbHVlIG9yIHJ2YWx1ZSBhcmd1bWVudC4KKworICAgICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICAgICAgICAgICAgIDxwcmU+c3RydWN0IGZ1bmN0b3IgeworICAgIHRlbXBsYXRlJmx0O2NsYXNzJmd0OyBzdHJ1Y3QgcmVzdWx0OworCisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgRiwgY2xhc3MgVCZndDsKKyAgICBzdHJ1Y3QgcmVzdWx0Jmx0O0YoVCkmZ3Q7IAorICAgICAgICA6IGJvb3N0OjpyZW1vdmVfY3YmbHQ7CisgICAgICAgICAgICAgIHR5cGVuYW1lIGJvb3N0OjpyZW1vdmVfcmVmZXJlbmNlJmx0O1QmZ3Q7Ojp0eXBlCisgICAgICAgICAgJmd0OworICAgIHt9OworCisgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsKKyAgICBUIG9wZXJhdG9yKCkoVCBjb25zdCZhbXA7IHgpIGNvbnN0OworfTs8L3ByZT4KKyAgICAgICAgICAgICAgICAgICA8L2Jsb2NrcXVvdGU+PC9saT4KKyAgICAgICAgICAgICAgICA8L3VsPgorCisgICAgICAgICAgICAgICAgPGEgbmFtZT0icmVzdWx0X29mX3RyMV9kaWZmIj4KKyAgICAgICAgICAgICAgICA8aDM+S25vd24gZGlmZmVyZW5jZXMgYmV0d2VlbiBib29zdDo6cmVzdWx0X29mIGFuZCBUUjEgcmVzdWx0X29mPC9oMz4KKyAgICAgICAgICAgICAgICA8L2E+CisKKyAgICAgICAgICAgICAgICBXaGVuIHVzaW5nIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiwgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4KKyAgICAgICAgICAgICAgICBpZ25vcmVzIHRoZSBUUjEgcHJvdG9jb2wgYW5kIGluc3RlYWQgZGVkdWNlcyB0aGUKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiBvYmplY3RzIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgdmlhIDxjb2RlPmRlY2x0eXBlPC9jb2RlPi4gSW4gbW9zdCBzaXR1YXRpb25zLCB1c2VycworICAgICAgICAgICAgICAgIHdpbGwgbm90IG5vdGljZSBhIGRpZmZlcmVuY2UsIHNvIGxvbmcgYXMgdGhleSB1c2UgdGhlCisgICAgICAgICAgICAgICAgcHJvdG9jb2wgY29ycmVjdGx5LiBUaGUgZm9sbG93aW5nIGFyZSBzaXR1YXRpb25zIGluCisgICAgICAgICAgICAgICAgd2hpY2ggdGhlIHR5cGUgZGVkdWNlZAorICAgICAgICAgICAgICAgIGJ5IDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+IGlzIGtub3duIHRvIGRpZmZlciBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgICAgICB3aGV0aGVyIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiBvciB0aGUgVFIxIHByb3RvY29sIGlzCisgICAgICAgICAgICAgICAgdXNlZC4KKworICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICA8bGk+IFRSMSBwcm90b2NvbCBtaXN1c2FnZQorCisgICAgICAgICAgICAgICAgICAgICA8cD5XaGVuIHVzaW5nIHRoZSBUUjEKKyAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgIGRldGVjdCB3aGV0aGVyIHRoZSBhY3R1YWwgdHlwZSBvZiBhIGNhbGwgdG8gYQorICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSB0eXBlIHNwZWNpZmllZAorICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIHByb3RvY29sLCB3aGljaCBhbGxvd3MgZm9yIHRoZSBwb3NzaWJpbGl0eQorICAgICAgICAgICAgICAgICAgICAgb2YgaW5hZHZlcnRlbnQgbWlzbWF0Y2hlcyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUgYW5kIHRoZSBhY3R1YWwgdHlwZS4gV2hlbgorICAgICAgICAgICAgICAgICAgICAgdXNpbmcgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+LCB0aGVzZSBzdWJ0bGUgYnVncworICAgICAgICAgICAgICAgICAgICAgbWF5IHJlc3VsdCBpbiBjb21waWxhdGlvbiBlcnJvcnMuIEZvciBleGFtcGxlOjwvcD4KKworICAgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgICA8cHJlPnN0cnVjdCBmdW5jdG9yIHsKKyAgIHR5cGVkZWYgc2hvcnQgcmVzdWx0X3R5cGU7CisgICBpbnQgb3BlcmF0b3IoKShzaG9ydCk7Cit9OworCisjaWZkZWYgQk9PU1RfUkVTVUxUX09GX1VTRV9ERUNMVFlQRQorCitCT09TVF9TVEFUSUNfQVNTRVJUKCgKKyAgIGJvb3N0Ojppc19zYW1lJmx0O2Jvb3N0OjpyZXN1bHRfb2YmbHQ7ZnVuY3RvcihzaG9ydCkmZ3Q7Ojp0eXBlLCBpbnQmZ3Q7Ojp2YWx1ZQorKSk7IAorCisjZWxzZQorCitCT09TVF9TVEFUSUNfQVNTRVJUKCgKKyAgIGJvb3N0Ojppc19zYW1lJmx0O2Jvb3N0OjpyZXN1bHRfb2YmbHQ7ZnVuY3RvcihzaG9ydCkmZ3Q7Ojp0eXBlLCBzaG9ydCZndDs6OnZhbHVlCispKTsKKworI2VuZGlmPC9wcmU+CisgICAgICAgICAgICAgICAgICAgPC9ibG9ja3F1b3RlPgorCisgICAgICAgICAgICAgICAgICA8cD5Ob3RlIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICAgICAgICAgICAgICBmb3JjZSA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPiB0byB1c2UgdGhlIFRSMQorICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdAorICAgICAgICAgICAgICAgICAgc3VwcG9ydCA8Y29kZT5kZWNsdHlwZTwvY29kZT4gYnkKKyAgICAgICAgICAgICAgICAgIGRlZmluaW5nIDxjb2RlPkJPT1NUX1JFU1VMVF9PRl9VU0VfVFIxPC9jb2RlPi48L3A+PC9saT4KKworICAgICAgICAgICAgICAgICAgPGxpPiBOdWxsYXJ5IGZ1bmN0aW9uIG9iamVjdHMKKworICAgICAgICAgICAgICAgICAgICAgICA8cD5XaGVuIHVzaW5nIHRoZSBUUjEgcHJvdG9jb2wsIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+CisgICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBhbHdheXMgZGVkdWNlIHRoZSB0eXBlIG9mIGNhbGxzIHRvCisgICAgICAgICAgICAgICAgICAgICAgIG51bGxhcnkgZnVuY3Rpb24gb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBkZWZhdWx0cyB0byB2b2lkLiBXaGVuIHVzaW5nIDxjb2RlPmRlY2x0eXBlPC9jb2RlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gYWx3YXlzIGdpdmVzIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbCBleHByZXNzaW9uLiBGb3IgZXhhbXBsZTo8L3A+CisKKyAgICAgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+c3RydWN0IGZ1bmN0b3IgeworICAgdGVtcGxhdGUmbHQ7Y2xhc3MmZ3Q7IHN0cnVjdCByZXN1bHQgeworICAgICAgIHR5cGVkZWYgaW50IHR5cGU7CisgICB9OworICAgaW50IG9wZXJhdG9yKCkoKTsKK307CisKKyNpZmRlZiBCT09TVF9SRVNVTFRfT0ZfVVNFX0RFQ0xUWVBFCisKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKAorICAgYm9vc3Q6OmlzX3NhbWUmbHQ7Ym9vc3Q6OnJlc3VsdF9vZiZsdDtmdW5jdG9yKCkmZ3Q7Ojp0eXBlLCBpbnQmZ3Q7Ojp2YWx1ZQorKSk7CisKKyNlbHNlCisKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKAorICAgYm9vc3Q6OmlzX3NhbWUmbHQ7Ym9vc3Q6OnJlc3VsdF9vZiZsdDtmdW5jdG9yKCkmZ3Q7Ojp0eXBlLCB2b2lkJmd0Ozo6dmFsdWUKKykpOworCisjZW5kaWY8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgPC9ibG9ja3F1b3RlPgorCisgICAgICAgICAgICAgICAgICAgICAgIDxwPk5vdGUgdGhhdCB0aGVyZSBhcmUgc29tZSB3b3JrYXJvdW5kcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIG51bGxhcnkgZnVuY3Rpb24gcHJvYmxlbS4gU28gbG9uZyBhcyB0aGUgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZG9lcyBub3QgdmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cmVzdWx0X3R5cGU8L2NvZGU+IGNhbiBhbHdheXMgYmUgdXNlZCB0bworICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSByZXR1cm4gdHlwZSByZWdhcmRsZXNzIG9mIGFyaXR5LiBJZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgZG9lcyB2YXJ5LCB0aGVuIHRoZSB1c2VyIGNhbgorICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsaXplIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+IGl0c2VsZiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbGFyeSBjYWxscy48L3A+PC9saT4KKworICAgICAgICAgICAgICAgICAgPGxpPiBOb24tY2xhc3MgcHJ2YWx1ZXMgYW5kIGN2LXF1YWxpZmljYXRpb24KKworICAgICAgICAgICAgICAgICAgICAgICA8cD5XaGVuIHVzaW5nIHRoZSBUUjEKKyAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wsIDxjb2RlPmJvb3N0OjpyZXN1bHRfb2Y8L2NvZGU+IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHRoZSBjdi1xdWFsaWZpZWQgdHlwZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgYnkgPGNvZGU+cmVzdWx0X3R5cGU8L2NvZGU+IG9yCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5yZXN1bHQ8L2NvZGU+IHRlbXBsYXRlIHJlZ2FyZGxlc3Mgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdHVhbCBjdi1xdWFsaWZpY2F0aW9uIG9mIHRoZSBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uIFdoZW4gdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+LCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlcG9ydCB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGNhbGwgZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbm90IGN2LXF1YWxpZmllZCB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNsYXNzIHBydmFsdWUuIEZvciBleGFtcGxlOjwvcD4KKworICAgICAgICAgICAgICAgICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgPHByZT5zdHJ1Y3QgZnVuY3RvciB7CisgICB0ZW1wbGF0ZSZsdDtjbGFzcyZndDsgc3RydWN0IHJlc3VsdDsKKyAgIHRlbXBsYXRlJmx0O2NsYXNzIEYsIGNsYXNzIFQmZ3Q7IHN0cnVjdCByZXN1bHQmbHQ7Rihjb25zdCBUKSZndDsgeworICAgICAgIHR5cGVkZWYgY29uc3QgVCB0eXBlOworICAgfTsKKworICAgY29uc3Qgc2hvcnQgb3BlcmF0b3IoKShjb25zdCBzaG9ydCk7CisgICBpbnQgY29uc3QgJiBvcGVyYXRvcigpKGludCBjb25zdCAmKTsKK307CisKKy8vIE5vbi1wcnZhbHVlIGNhbGwgZXhwcmVzc2lvbnMgd29yayB0aGUgc2FtZSB3aXRoIG9yIHdpdGhvdXQgZGVjbHR5cGUuCisKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKAorICAgYm9vc3Q6OmlzX3NhbWUmbHQ7CisgICAgICAgYm9vc3Q6OnJlc3VsdF9vZiZsdDtmdW5jdG9yKGludCBjb25zdCAmKSZndDs6OnR5cGUsCisgICAgICAgaW50IGNvbnN0ICYKKzo6dmFsdWUKKykpOworCisvLyBOb24tY2xhc3MgcHJ2YWx1ZSBjYWxsIGV4cHJlc3Npb25zIGFyZSBub3QgYWN0dWFsbHkgY3YtcXVhbGlmaWVkLAorLy8gYnV0IG9ubHkgdGhlIGRlY2x0eXBlLWJhc2VkIHJlc3VsdF9vZiByZXBvcnRzIHRoaXMgYWNjdXJhdGVseS4KKworI2lmZGVmIEJPT1NUX1JFU1VMVF9PRl9VU0VfREVDTFRZUEUKKworQk9PU1RfU1RBVElDX0FTU0VSVCgoCisgICBib29zdDo6aXNfc2FtZSZsdDsKKyAgICAgICBib29zdDo6cmVzdWx0X29mJmx0O2Z1bmN0b3IoY29uc3Qgc2hvcnQpJmd0Ozo6dHlwZSwKKyAgICAgICBzaG9ydAorOjp2YWx1ZQorKSk7CisKKyNlbHNlCisKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKAorICAgYm9vc3Q6OmlzX3NhbWUmbHQ7CisgICAgICAgYm9vc3Q6OnJlc3VsdF9vZiZsdDtmdW5jdG9yKGNvbnN0IHNob3J0KSZndDs6OnR5cGUsCisgICAgICAgY29uc3Qgc2hvcnQKKzo6dmFsdWUKKykpOworCisjZW5kaWY8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgICAgPC9ibG9ja3F1b3RlPjwvbGk+CisgICAgICAgICAgICAgICAgPC91bD4KKworICAgICAgICAgICAgICAgIDxhIG5hbWU9InJlc3VsdF9vZl9jeHgxMV9kaWZmIj4KKyAgICAgICAgICAgICAgICA8aDM+S25vd24gZGlmZmVyZW5jZXMgYmV0d2VlbiBib29zdDo6cmVzdWx0X29mIGFuZCBDKysxMSByZXN1bHRfb2Y8L2gzPgorICAgICAgICAgICAgICAgIDwvYT4KKworICAgICAgICAgICAgICAgIDxwPldoZW4gdXNpbmcgPGNvZGU+ZGVjbHR5cGU8L2NvZGU+LCA8Y29kZT5ib29zdDo6cmVzdWx0X29mPC9jb2RlPgorICAgICAgICAgICAgICAgIGltcGxlbWVudHMgbW9zdCBvZiB0aGUgQysrMTEgcmVzdWx0X29mCisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi4gT25lIGtub3duIGV4Y2VwdGlvbiBpcyB0aGF0CisgICAgICAgICAgICAgICAgPGNvZGU+Ym9vc3Q6OnJlc3VsdF9vZjwvY29kZT4gZG9lcyBub3QgaW1wbGVtZW50IHRoZQorICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cyByZWdhcmRpbmcgcG9pbnRlcnMgdG8gbWVtYmVyIGRhdGEuPC9wPgorCisgICAgICAgICAgICAgICAgPHA+Q3JlYXRlZCBieSBEb3VnIEdyZWdvci4gQ29udHJpYnV0aW9ucyBmcm9tIERhbmllbCBXYWxrZXIsIEVyaWMgTmllYmxlciwgTWljaGVsIE1vcmluIGFuZCBvdGhlcnM8L3A+CisKKwkJPGgyPjxhIG5hbWU9IkJPT1NUX0JJTkFSWSI+TWFjcm8gQk9PU1RfQklOQVJZPC9hPjwvaDI+CisKKwkJPHA+VGhlIG1hY3JvIDxjb2RlPkJPT1NUX0JJTkFSWTwvY29kZT4gaXMgdXNlZCBmb3IgdGhlCisgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgYmluYXJ5IGxpdGVyYWxzLiBJdCB0YWtlcyBhcyBhbiBhcmd1bWVudAorICAgICAgICAgICAgICAgIGEgYmluYXJ5IG51bWJlciBhcnJhbmdlZCBhcyBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIDFzIGFuZCAwcyBpbgorICAgICAgICAgICAgICAgIGdyb3VwaW5ncyBvZiBsZW5ndGggMSB0byA4LCB3aXRoIGdyb3VwcyBzZXBhcmF0ZWQKKyAgICAgICAgICAgICAgICBieSBzcGFjZXMuIFRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsIHlpZWxkZWQgaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRob3NlIG9mIGhleCBhbmQgb2N0YWwKKyAgICAgICAgICAgICAgICBsaXRlcmFscyAoPGk+Mi4xMy4xcDE8L2k+KS4gQnkgaW1wbGVtZW50YXRpb24sIHRoaXMgbWFjcm8KKyAgICAgICAgICAgICAgICBleHBhbmRzIGRpcmVjdGx5IHRvIGFuIG9jdGFsIGxpdGVyYWwgZHVyaW5nIHByZXByb2Nlc3NpbmcsIHNvCisgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gb3ZlcmhlYWQgYXQgcnVudGltZSBhbmQgdGhlIHJlc3VsdCBpcyB1c2VhYmxlIGluCisgICAgICAgICAgICAgICAgYW55IHBsYWNlIHRoYXQgYW4gb2N0YWwgbGl0ZXJhbCB3b3VsZCBiZS48L3A+CisKKwkJPHA+SW4gb3JkZXIgdG8gZGlyZWN0bHkgc3VwcG9ydCBiaW5hcnkgbGl0ZXJhbHMgd2l0aCBzdWZmaXhlcywKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsIG1hY3JvcyBvZiB0aGUgZm9ybSBCT09TVF9CSU5BUllfWFhYIGFyZSBhbHNvCisgICAgICAgICAgICAgICAgcHJvdmlkZWQsIHdoZXJlIFhYWCBpcyBhIHN0YW5kYXJkIGludGVnZXIgc3VmZml4IGluIGFsbCBjYXBpdGFsCisgICAgICAgICAgICAgICAgbGV0dGVycy4gSW4gYWRkaXRpb24sIExMIGFuZCBVTEwgc3VmZml4ZXMgbWF5IGJlIHVzZWQgZm9yIHJlcHJlc2VudGluZworICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzIGluIGNvbXBpbGVycyB3aGljaCBwcm92aWRlCisgICAgICAgICAgICAgICAgdGhlbSBhcyBhbiBleHRlbnNpb24uPC9wPgorCisKKyAgICAgICAgICAgICAgICA8cD5UaGUgQk9PU1RfQklOQVJZIGZhbWlseSBvZiBtYWNyb3MgcmVzaWRlcyBpbiB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgPGEKKyAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9ib29zdC91dGlsaXR5L2JpbmFyeS5ocHAiPiZsdDtib29zdC91dGlsaXR5L2JpbmFyeS5ocHAmZ3Q7PC9hPgorICAgICAgICAgICAgICAgIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkKKyAgICAgICAgICAgICAgICA8YQorICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL2Jvb3N0L3V0aWxpdHkuaHBwIj4mbHQ7Ym9vc3QvdXRpbGl0eS5ocHAmZ3Q7PC9hPi4KKworCQk8cD5Db250cmlidXRlZCBieSBNYXR0IENhbGFicmVzZS48L3A+PHA+CisJCTwvcD48aDM+RXhhbXBsZTwvaDM+CisJCTxibG9ja3F1b3RlPgorCQkJPHByZT4KK3ZvaWQgZm9vKCBpbnQgKTsKKwordm9pZCBmb28oIHVuc2lnbmVkIGxvbmcgKTsKKwordm9pZCBiYXIoKQoreworICBpbnQgdmFsdWUxID0gQk9PU1RfQklOQVJZKCAxMDAgMTExMDAwIDAxIDEgMTEwICk7CisKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTIgPSBCT09TVF9CSU5BUllfVUwoIDEwMCAwMDEgKTsgLy8gdW5zaWduZWQgbG9uZworCisgIGxvbmcgbG9uZyB2YWx1ZTMgPSBCT09TVF9CSU5BUllfTEwoIDExIDAwMCApOyAvLyBsb25nIGxvbmcgaWYgc3VwcG9ydGVkCisKKyAgYXNzZXJ0KCAgICBCT09TVF9CSU5BUlkoIDEwMDEwICkKKyAgICAgICAgICAmICBCT09TVF9CSU5BUlkoIDExMDAwICkKKyAgICAgICAgICA9PSBCT09TVF9CSU5BUlkoIDEwMDAwICkKKyAgICAgICAgKTsKKworICBmb28oIEJPT1NUX0JJTkFSWSggMTAxMCApICk7IC8vIGNhbGxzIHRoZSBmaXJzdCBmb28KKworICBmb28oIEJPT1NUX0JJTkFSWV9MVSggMTAxMCApICk7IC8vIGNhbGxzIHRoZSBzZWNvbmQgZm9vCit9Cis8L3ByZT48L2Jsb2NrcXVvdGU+CisJCTxocj4KKwkJPHA+UmV2aXNlZCZuYnNwOyA8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBTLVR5cGU9IkVESVRFRCIgUy1Gb3JtYXQ9IiVkICVCLCAlWSIgc3RhcnRzcGFuCistLT4wNCBTZXB0ZW1iZXIsIDIwMDg8IS0td2ViYm90IGJvdD0iVGltZXN0YW1wIiBlbmRzcGFuIGktY2hlY2tzdW09IjM5MzY5IgorLS0+CisJCTwvcD4KKwkJPHA+JmNvcHk7IENvcHlyaWdodCBCZW1hbiBEYXdlcyAxOTk5LTIwMDMuPC9wPgorPHA+RGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiBTZWUKKzxhIGhyZWY9Imh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCI+d3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQ8L2E+PC9wPgorCisJPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdmFsdWVfaW5pdC5odG0gYi92YWx1ZV9pbml0Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIyZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdmFsdWVfaW5pdC5odG0KQEAgLTAsMCArMSw1MTQgQEAKKzxodG1sPgorPGhlYWQ+CisgICAgICAgICAgICAgCisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKKyBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgIDx0aXRsZT52YWx1ZV9pbml0aWFsaXplZDwvdGl0bGU+CisgICAgCis8L2hlYWQ+CisgIDxib2R5IHZsaW5rPSIjODAwMDgwIiBsaW5rPSIjMDAwMGZmIiB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KKyAgICAgICAgICAgICAgICAgICAKKzxoMj48aW1nIHNyYz0iLi4vLi4vYm9vc3QucG5nIiB3aWR0aD0iMjc2IiBoZWlnaHQ9Ijg2Ij4KKyAgICAgICAgIEhlYWRlciAmbHQ7PGEgaHJlZj0iLi4vLi4vYm9vc3QvdXRpbGl0eS92YWx1ZV9pbml0LmhwcCI+Ym9vc3QvdXRpbGl0eS92YWx1ZV9pbml0LmhwcDwvYT4mZ3Q7CisgICAgIDwvaDI+CisgICAgICAgICAgICAgICAgICAgCis8aDI+Q29udGVudHM8L2gyPgorICAgICAgICAgICAgICAgICAgIAorPGRsPgorICA8ZHQ+PGEgaHJlZj0iI3JhdGlvbmFsZSI+UmF0aW9uYWxlPC9hPjwvZHQ+CisgIDxkdD48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2R0PgorICA8ZHQ+PGEgaHJlZj0iI2RldGFpbHMiPkRldGFpbHM8L2E+PC9kdD4KKzwvZGw+CisgICAgICAgICAgICAgICAgICAgCis8dWw+CisgICAgICAgICAgPGxpPjxhIGhyZWY9IiN2YWx1ZWluaXQiPnZhbHVlLWluaXRpYWxpemF0aW9uPC9hPjwvbGk+CisgICAgICAgICAgPGxpPjxhIGhyZWY9IiN2YWx1ZWluaXRzeW4iPnZhbHVlLWluaXRpYWxpemF0aW9uIHN5bnRheDwvYT48L2xpPgorICAgICAgICAgIDxsaT48YSBocmVmPSIjY29tcGlsZXJfaXNzdWVzIj5jb21waWxlciBpc3N1ZXM8L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAKKzwvdWw+CisgICAgICAgICAgICAgICAgICAgCis8ZGwgY2xhc3M9InBhZ2UtaW5kZXgiPgorICA8ZHQ+PGEgaHJlZj0iI3R5cGVzIj5UeXBlcyBhbmQgb2JqZWN0czwvYT48L2R0PgorPC9kbD4KKyAgICAgICAgICAgICAgICAgICAKKzx1bD4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI3ZhbF9pbml0Ij48Y29kZT50ZW1wbGF0ZSBjbGFzcyB2YWx1ZV9pbml0aWFsaXplZCZsdDtUJmd0OzwvY29kZT48L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2luaXRpYWxpemVkIj48Y29kZT50ZW1wbGF0ZSBjbGFzcyBpbml0aWFsaXplZCZsdDtUJmd0OzwvY29kZT48L2E+PC9saT4KKyAgICAgICAgICA8bGk+PGEgaHJlZj0iI2luaXRpYWxpemVkX3ZhbHVlIj48Y29kZT5pbml0aWFsaXplZF92YWx1ZTwvY29kZT48L2E+PC9saT4KKyAgICAgICAgICAgICAgICAgICAKKzwvdWw+CisgICAgICAgICAgICAgIDxhIGhyZWY9IiNhY2tub3dsZWRnZW1lbnRzIj5BY2tub3dsZWRnZW1lbnRzPC9hPjxicj4KKyAgICAgPGJyPgorICAgICAgICAgCis8aHI+ICAgICAgICAgIAorPGgyPjxhIG5hbWU9InJhdGlvbmFsZSI+PC9hPlJhdGlvbmFsZTwvaDI+CisgICAgICAgICAgICAgICAgICAKKzxwPkNvbnN0cnVjdGluZyBhbmQgaW5pdGlhbGl6aW5nIG9iamVjdHMgaW4gYSBnZW5lcmljIHdheSBpcyBkaWZmaWN1bHQgaW4KKyAgICBDKysuIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHJ1bGVzIHRoYXQgYXBwbHkKK2ZvciAgICBpbml0aWFsaXphdGlvbi4gRGVwZW5kaW5nIG9uIHRoZSB0eXBlLCB0aGUgdmFsdWUgb2YgYSBuZXdseSBjb25zdHJ1Y3RlZAorICBvYmplY3QgIGNhbiBiZSB6ZXJvLWluaXRpYWxpemVkIChsb2dpY2FsbHkgMCksIGRlZmF1bHQtY29uc3RydWN0ZWQgKHVzaW5nCisgIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yKSwgb3IgaW5kZXRlcm1pbmF0ZS4gV2hlbiB3cml0aW5nIGdlbmVyaWMgY29kZSwKK3RoaXMgIHByb2JsZW0gbXVzdCBiZSBhZGRyZXNzZWQuIFRoZSB0ZW1wbGF0ZSA8Y29kZT52YWx1ZV9pbml0aWFsaXplZDwvY29kZT4gcHJvdmlkZXMKK2Egc29sdXRpb24gICB3aXRoIGNvbnNpc3RlbnQgc3ludGF4IGZvciB2YWx1ZSAgIGluaXRpYWxpemF0aW9uIG9mIHNjYWxhciwKK3VuaW9uIGFuZCBjbGFzcyAgIHR5cGVzLgorTW9yZW92ZXIsIDxjb2RlPnZhbHVlX2luaXRpYWxpemVkPC9jb2RlPiBvZmZlcnMgYSB3b3JrYXJvdW5kIHRvIHZhcmlvdXMKK2NvbXBpbGVyIGlzc3VlcyByZWdhcmRpbmcgdmFsdWUtaW5pdGlhbGl6YXRpb24uCisKK0Z1cnRoZXJtb3JlLCBhIDxjb2RlPmNvbnN0PC9jb2RlPiBvYmplY3QsIDxjb2RlPmluaXRpYWxpemVkX3ZhbHVlPC9jb2RlPiBpcyBwcm92aWRlZCwKK3RvIGF2b2lkIHJlcGVhdGluZyB0aGUgdHlwZSBuYW1lIHdoZW4gcmV0cmlldmluZyB0aGUgdmFsdWUgZnJvbSBhCis8Y29kZT52YWx1ZV9pbml0aWFsaXplZCZsdDtUJmd0OzwvY29kZT4gb2JqZWN0LgorPGJyPgorICA8L3A+CisgICAgICAgIAorPGgyPjxhIG5hbWU9ImludHJvIj48L2E+SW50cm9kdWN0aW9uPC9oMj4KKyAgICAgCis8cD4KK1RoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gaW5pdGlhbGl6ZSBhIHZhcmlhYmxlLCBpbiBDKysuIFRoZSBmb2xsb3dpbmcKK2RlY2xhcmF0aW9ucyBhbGwgPGVtPm1heTwvZW0+IGhhdmUgYSBsb2NhbCB2YXJpYWJsZSBpbml0aWFsaXplZCB0byBpdHMgZGVmYXVsdAordmFsdWU6Cis8cHJlPgorICBUMSB2YXIxOworICBUMiB2YXIyID0gMDsKKyAgVDMgdmFyMyA9IHt9OworICBUNCB2YXI0ID0gVDQoKTsKKzwvcHJlPiAKK1VuZm9ydHVuYXRlbHksIHdoZXRoZXIgb3Igbm90IGFueSBvZiB0aG9zZSBkZWNsYXJhdGlvbnMgY29ycmVjdGx5Citpbml0aWFsaXplIHRoZSB2YXJpYWJsZSB2ZXJ5IG11Y2ggZGVwZW5kcyBvbiBpdHMgdHlwZS4gVGhlIGZpcnN0CitkZWNsYXJhdGlvbiBpcyB2YWxpZCBmb3IgYW55IDxhIGhyZWY9Imh0dHA6Ly93d3cuc2dpLmNvbS90ZWNoL3N0bC9EZWZhdWx0Q29uc3RydWN0aWJsZS5odG1sIj4KK0RlZmF1bHRDb25zdHJ1Y3RpYmxlPC9hPiB0eXBlIChieSBkZWZpbml0aW9uKS4KK0hvd2V2ZXIsIGl0IGRvZXMgbm90IGFsd2F5cyBkbyBhbiBpbml0aWFsaXphdGlvbiEKK0l0IGNvcnJlY3RseSBpbml0aWFsaXplcyB0aGUgdmFyaWFibGUgd2hlbiBpdCdzIGFuIGluc3RhbmNlIG9mIGEKK2NsYXNzLCBhbmQgdGhlIGF1dGhvciBvZiB0aGUgY2xhc3MgaGFzIHByb3ZpZGVkIGEgcHJvcGVyIGRlZmF1bHQKK2NvbnN0cnVjdG9yLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIHZhbHVlIG9mIDxjb2RlPnZhcjE8L2NvZGU+IGlzIDxlbT5pbmRldGVybWluYXRlPC9lbT4gd2hlbgoraXRzIHR5cGUgaXMgYW4gYXJpdGhtZXRpYyB0eXBlLCBsaWtlIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgb3IgPGNvZGU+Y2hhcjwvY29kZT4uCitBbiBhcml0aG1ldGljIHZhcmlhYmxlCitpcyBvZiBjb3Vyc2UgaW5pdGlhbGl6ZWQgcHJvcGVybHkgYnkgdGhlIHNlY29uZCBkZWNsYXJhdGlvbiwgPGNvZGU+VDIKK3ZhcjIgPSAwPC9jb2RlPi4gQnV0IHRoaXMgaW5pdGlhbGl6YXRpb24gZm9ybSB1c3VhbGx5IHdvbid0IHdvcmsgZm9yIGEKK2NsYXNzIHR5cGUgKHVubGVzcyB0aGUgY2xhc3Mgd2FzIGVzcGVjaWFsbHkgd3JpdHRlbiB0byBzdXBwb3J0IGJlaW5nCitpbml0aWFsaXplZCB0aGF0IHdheSkuIFRoZSB0aGlyZCBmb3JtLCAgPGNvZGU+VDMgdmFyMyA9IHt9PC9jb2RlPgoraW5pdGlhbGl6ZXMgYW4gYWdncmVnYXRlLCB0eXBpY2FsbHkgYSAiQy1zdHlsZSIgPGNvZGU+c3RydWN0PC9jb2RlPiBvciBhICJDLXN0eWxlIiBhcnJheS4KK0hvd2V2ZXIsIHRoZSBzeW50YXggaXMgbm90IGFsbG93ZWQgZm9yIGEgY2xhc3MgdGhhdCBoYXMgYW4gZXhwbGljaXRseSBkZWNsYXJlZAorY29uc3RydWN0b3IuICAoQnV0IHdhdGNoIG91dCBmb3IgYW4gdXBjb21pbmcgQysrIGxhbmd1YWdlIGNoYW5nZSwgCitieSBCamFybmUgU3Ryb3VzdHJ1cCBldCBhbCBbPGEgaHJlZj0iI3JlZmVyZW5jZXMiPjE8L2E+XSEpCitUaGUgZm91cnRoIGZvcm0gaXMgdGhlIG1vc3QgZ2VuZXJpYyBmb3JtIG9mIHRoZW0sIGFzIGl0CitjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIGFyaXRobWV0aWMgdHlwZXMsIGNsYXNzIHR5cGVzLCBhZ2dyZWdhdGVzLCBwb2ludGVycywgYW5kCitvdGhlciB0eXBlcy4gVGhlIGRlY2xhcmF0aW9uLCAgPGNvZGU+VDQgdmFyNCA9IFQ0KCk8L2NvZGU+LCBzaG91bGQgYmUgcmVhZAorYXMgZm9sbG93czogRmlyc3QgYSB0ZW1wb3Jhcnkgb2JqZWN0IGlzIGNyZWF0ZWQsIGJ5IDxjb2RlPlQ0KCk8L2NvZGU+LgorVGhpcyBvYmplY3QgaXMgPGEgaHJlZj0iI3ZhbHVlaW5pdCI+dmFsdWUtaW5pdGlhbGl6ZWQ8L2E+LiBOZXh0IHRoZSB0ZW1wb3JhcnkKK29iamVjdCBpcyBjb3BpZWQgdG8gdGhlIG5hbWVkIHZhcmlhYmxlLCA8Y29kZT52YXI0PC9jb2RlPi4gQWZ0ZXJ3YXJkcywgdGhlIHRlbXBvcmFyeQoraXMgZGVzdHJveWVkLiBXaGlsZSB0aGUgY29weWluZyBhbmQgdGhlIGRlc3RydWN0aW9uIGFyZSBsaWtlbHkgdG8KK2JlIG9wdGltaXplZCBhd2F5LCBDKysgc3RpbGwgcmVxdWlyZXMgdGhlIHR5cGUgPGNvZGU+VDQ8L2NvZGU+IHRvIGJlCis8YSBocmVmPSJDb3B5Q29uc3RydWN0aWJsZS5odG1sIj5Db3B5Q29uc3RydWN0aWJsZTwvYT4uCisoU28gPGNvZGU+VDQ8L2NvZGU+IG5lZWRzIHRvIGJlIDxlbT5ib3RoPC9lbT4gRGVmYXVsdENvbnN0cnVjdGlibGUgPGVtPmFuZDwvZW0+IENvcHlDb25zdHJ1Y3RpYmxlLikgCitBIGNsYXNzIG1heSBub3QgYmUgQ29weUNvbnN0cnVjdGlibGUsIGZvciBleGFtcGxlIGJlY2F1c2UgaXQgbWF5IGhhdmUgYQorcHJpdmF0ZSBhbmQgdW5kZWZpbmVkIGNvcHkgY29uc3RydWN0b3IsCitvciBiZWNhdXNlIGl0IG1heSBiZSBkZXJpdmVkIGZyb20gPGEgaHJlZj0idXRpbGl0eS5odG0jQ2xhc3Nfbm9uY29weWFibGUiPmJvb3N0Ojpub25jb3B5YWJsZTwvYT4uCitTY290dCBNZXllcnMgWzxhIGhyZWY9IiNyZWZlcmVuY2VzIj4yPC9hPl0gZXhwbGFpbnMgd2h5IGEgY2xhc3Mgd291bGQgYmUgZGVmaW5lZCBsaWtlIHRoYXQuCis8L3A+Cis8cD4KK1RoZXJlIGlzIGFub3RoZXIsIGxlc3Mgb2J2aW91cyBkaXNhZHZhbnRhZ2UgdG8gdGhlIGZvdXJ0aCBmb3JtLCA8Y29kZT5UNCB2YXI0ID0gVDQoKTwvY29kZT46CitJdCBzdWZmZXJzIGZyb20gdmFyaW91cyAgPGEgaHJlZj0iI2NvbXBpbGVyX2lzc3VlcyI+Y29tcGlsZXIgaXNzdWVzPC9hPiwgY2F1c2luZworYSB2YXJpYWJsZSB0byBiZSBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4gc29tZSBjb21waWxlciBzcGVjaWZpYyBjYXNlcy4KKzwvcD4KKzxwPgorVGhlIHRlbXBsYXRlIDxhIGhyZWY9IiN2YWxfaW5pdCI+PGNvZGU+dmFsdWVfaW5pdGlhbGl6ZWQ8L2NvZGU+PC9hPgorb2ZmZXJzIGEgZ2VuZXJpYyB3YXkgdG8gaW5pdGlhbGl6ZQorYW4gb2JqZWN0LCBsaWtlIDxjb2RlPlQ0IHZhcjQgPSBUNCgpPC9jb2RlPiwgYnV0IHdpdGhvdXQgcmVxdWlyaW5nIGl0cyB0eXBlCit0byBiZSBDb3B5Q29uc3RydWN0aWJsZS4gQW5kIGl0IG9mZmVycyBhIHdvcmthcm91bmQgdG8gdGhvc2UgY29tcGlsZXIgaXNzdWVzCityZWdhcmRpbmcgdmFsdWUtaW5pdGlhbGl6YXRpb24gYXMgd2VsbCEgSXQgYWxsb3dzIGdldHRpbmcgYW4gaW5pdGlhbGl6ZWQKK3ZhcmlhYmxlIG9mIGFueSB0eXBlOyBpdCA8ZW0+b25seTwvZW0+IHJlcXVpcmVzIHRoZSB0eXBlIHRvIGJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlLgorQSBwcm9wZXJseSA8ZW0+dmFsdWUtaW5pdGlhbGl6ZWQ8L2VtPiBvYmplY3Qgb2YgdHlwZSA8Y29kZT5UPC9jb2RlPiBpcworY29uc3RydWN0ZWQgYnkgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbjoKKzxwcmU+CisgIHZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7IHZhcjsKKzwvcHJlPgorPC9wPgorPHA+CitUaGUgdGVtcGxhdGUgPGEgaHJlZj0iI2luaXRpYWxpemVkIj48Y29kZT5pbml0aWFsaXplZDwvY29kZT48L2E+CitvZmZlcnMgYm90aCB2YWx1ZS1pbml0aWFsaXphdGlvbiBhbmQgZGlyZWN0LWluaXRpYWxpemF0aW9uLgorSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgYXMgYSBkYXRhIG1lbWJlciB0eXBlLCBhbGxvd2luZyB0aGUgdmVyeSBzYW1lIG9iamVjdAordG8gYmUgZWl0aGVyIGRpcmVjdC1pbml0aWFsaXplZCBvciB2YWx1ZS1pbml0aWFsaXplZC4KKzwvcD4KKzxwPgorVGhlIDxjb2RlPmNvbnN0PC9jb2RlPiBvYmplY3QgPGEgaHJlZj0iI2luaXRpYWxpemVkX3ZhbHVlIj48Y29kZT5pbml0aWFsaXplZF92YWx1ZTwvY29kZT48L2E+CithbGxvd3MgdmFsdWUtaW5pdGlhbGl6aW5nIGEgdmFyaWFibGUgYXMgZm9sbG93czoKKzxwcmU+CisgIFQgdmFyID0gaW5pdGlhbGl6ZWRfdmFsdWUgOworPC9wcmU+CitUaGlzIGZvcm0gb2YgaW5pdGlhbGl6YXRpb24gaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gPGNvZGU+VDQgdmFyNCA9IFQ0KCk8L2NvZGU+LAorYnV0IHJvYnVzdCBhZ2FpbnN0IHRoZSBhZm9yZW1lbnRpb25lZCBjb21waWxlciBpc3N1ZXMuCisKKzwvcD4KKworPGgyPjxhIG5hbWU9ImRldGFpbHMiPjwvYT5EZXRhaWxzPC9oMj4KKzxwPlRoZSBDKysgc3RhbmRhcmQgWzxhIGhyZWY9IiNyZWZlcmVuY2VzIj4zPC9hPl0gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIAorICAgIG9mIDxjb2RlPnplcm8taW5pdGlhbGl6YXRpb248L2NvZGU+IGFuZCA8Y29kZT5kZWZhdWx0LWluaXRpYWxpemF0aW9uPC9jb2RlPi4KKyAgICAgSW5mb3JtYWxseSwgemVyby1pbml0aWFsaXphdGlvbiBtZWFucyB0aGF0IHRoZSBvYmplY3QgaXMgZ2l2ZW4gdGhlIGluaXRpYWwKKyAgICAgdmFsdWUgMCAoY29udmVydGVkIHRvIHRoZSB0eXBlKSBhbmQgZGVmYXVsdC1pbml0aWFsaXphdGlvbiBtZWFucyB0aGF0CisgUE9EICAgWzxhIGhyZWY9IiNyZWZlcmVuY2VzIj40PC9hPl0gdHlwZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQsIHdoaWxlIG5vbi1QT0QgY2xhc3MKKyB0eXBlcyAgIGFyZSBpbml0aWFsaXplZCB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuIEEKKzxpPmRlY2xhcmF0aW9uPC9pPiAgIGNhbiBjb250YWluIGFuIDxpPmluaXRpYWxpemVyPC9pPiwgd2hpY2ggc3BlY2lmaWVzIHRoZQorb2JqZWN0J3MgaW5pdGlhbCB2YWx1ZS4gIFRoZSBpbml0aWFsaXplciBjYW4gYmUganVzdCAnKCknLCB3aGljaCBzdGF0ZXMgdGhhdAordGhlIG9iamVjdCBzaGFsbCBiZSB2YWx1ZS1pbml0aWFsaXplZCAgKGJ1dCBzZWUgYmVsb3cpLiBIb3dldmVyLCBpZiBhIDxpPmRlY2xhcmF0aW9uPC9pPiAKKyAgaGFzIG5vIDxpPmluaXRpYWxpemVyPC9pPiAgYW5kIGl0IGlzIG9mIGEgbm9uLTxjb2RlPmNvbnN0PC9jb2RlPiwgbm9uLTxjb2RlPnN0YXRpYzwvY29kZT4gCisgICBQT0QgdHlwZSwgdGhlIGluaXRpYWwgdmFsdWUgaXMgaW5kZXRlcm1pbmF0ZTogPGNpdGU+KHNlZSAmc2VjdDs4LjUsIFtkY2wuaW5pdF0sIGZvciB0aGUKKyAgIGFjY3VyYXRlIGRlZmluaXRpb25zKS48L2NpdGU+PC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT5pbnQgeCA7IC8vIG5vIGluaXRpYWxpemVyLiB4IHZhbHVlIGlzIGluZGV0ZXJtaW5hdGUuPGJyPnN0ZDo6c3RyaW5nIHMgOyAvLyBubyBpbml0aWFsaXplciwgcyBpcyBkZWZhdWx0LWNvbnN0cnVjdGVkLjxicj48YnI+aW50IHkgPSBpbnQoKSA7IDxicj4vLyB5IGlzIGluaXRpYWxpemVkIHVzaW5nIGNvcHktaW5pdGlhbGl6YXRpb248YnI+Ly8gYnV0IHRoZSB0ZW1wb3JhcnkgdXNlcyBhbiBlbXB0eSBzZXQgb2YgcGFyZW50aGVzZXMgYXMgdGhlIGluaXRpYWxpemVyLDxicj4vLyBzbyBpdCBpcyBkZWZhdWx0LWNvbnN0cnVjdGVkLjxicj4vLyBBIGRlZmF1bHQgY29uc3RydWN0ZWQgUE9EIHR5cGUgaXMgemVyby1pbml0aWFsaXplZCw8YnI+Ly8gdGhlcmVmb3JlLCB5ID09IDAuPGJyPjxicj52b2lkIGZvbyAoIHN0ZDo6c3RyaW5nICkgOzxicj5mb28gKCBzdGQ6OnN0cmluZygpICkgOyA8YnI+Ly8gdGhlIHRlbXBvcmFyeSBzdHJpbmcgaXMgZGVmYXVsdCBjb25zdHJ1Y3RlZCA8YnI+Ly8gYXMgaW5kaWNhdGVkIGJ5IHRoZSBpbml0aWFsaXplciAoKSAgPC9wcmU+CisgICAgICAgICAgICAgICAgICAgIAorPGgzPjxhIG5hbWU9InZhbHVlaW5pdCI+dmFsdWUtaW5pdGlhbGl6YXRpb248L2E+PC9oMz4KKyAgICAgICAgICAgICAgICAgICAKKzxwPlRoZSBmaXJzdCA8YQorIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL0pUQzEvU0MyMi9XRzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCI+VGVjaG5pY2FsIAorICBDb3JyaWdlbmR1bSBmb3IgdGhlIEMrKyBTdGFuZGFyZDwvYT4gKFRDMSksIHdob3NlIGRyYWZ0ICAgd2FzIHJlbGVhc2VkIHRvCisgIHRoZSBwdWJsaWMgaW4gTm92ZW1iZXIgMjAwMSwgaW50cm9kdWNlZCA8YQorIGhyZWY9Imh0dHA6Ly93d3cub3Blbi1zdGQub3JnL0pUQzEvU0MyMi9XRzIxL2RvY3MvY3dnX2RlZmVjdHMuaHRtbCMxNzgiPkNvcmUgCisgIElzc3VlIDE3ODwvYT4gKGFtb25nICAgbWFueSBvdGhlciBpc3N1ZXMsIG9mIGNvdXJzZSkuPC9wPgorICAgICAgICAgICAgICAgICAgIAorPHA+IFRoYXQgaXNzdWUgaW50cm9kdWNlZCB0aGUgbmV3IGNvbmNlcHQgb2YgPGNvZGU+dmFsdWUtaW5pdGlhbGl6YXRpb248L2NvZGU+CisgICAgIChpdCBhbHNvIGZpeGVkIHRoZSB3b3JkaW5nIGZvciB6ZXJvLWluaXRpYWxpemF0aW9uKS4gSW5mb3JtYWxseSwgdmFsdWUtaW5pdGlhbGl6YXRpb24gCisgICAgaXMgc2ltaWxhciB0byBkZWZhdWx0LWluaXRpYWxpemF0aW9uIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGluIHNvbWUgY2FzZXMKKyAgICBub24tc3RhdGljIGRhdGEgbWVtYmVycyBhbmQgYmFzZSBjbGFzcyBzdWItb2JqZWN0cyBhcmUgYWxzbyB2YWx1ZS1pbml0aWFsaXplZC4gCisgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBhbiBvYmplY3QgdGhhdCBpcyB2YWx1ZS1pbml0aWFsaXplZCB3b24ndCBoYXZlIAorKG9yICAgIGF0IGxlYXN0IGlzIGxlc3MgbGlrZWx5IHRvIGhhdmUpIGluZGV0ZXJtaW5hdGUgdmFsdWVzIGZvciBkYXRhIG1lbWJlcnMgCisgYW5kICAgYmFzZSBjbGFzcyBzdWItb2JqZWN0czsgdW5saWtlIHRoZSBjYXNlIG9mIGFuIG9iamVjdCBkZWZhdWx0IGNvbnN0cnVjdGVkLiAKKyAgICAoc2VlIENvcmUgSXNzdWUgMTc4IGZvciBhIG5vcm1hdGl2ZSBkZXNjcmlwdGlvbikuPC9wPgorICAgICAgICAgICAgICAgICAgIAorPHA+SW4gb3JkZXIgdG8gc3BlY2lmeSB2YWx1ZS1pbml0aWFsaXphdGlvbiBvZiBhbiBvYmplY3Qgd2UgbmVlZCB0byB1c2UgdGhlCisgICAgIGVtcHR5LXNldCBpbml0aWFsaXplcjogKCkuIDwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwPkFzIGJlZm9yZSwgYSBkZWNsYXJhdGlvbiB3aXRoIG5vIGludGlhbGl6ZXIgc3BlY2lmaWVzIGRlZmF1bHQtaW5pdGlhbGl6YXRpb24sIAorICAgIGFuZCBhIGRlY2xhcmF0aW9uIHdpdGggYSBub24tZW1wdHkgaW5pdGlhbGl6ZXIgc3BlY2lmaWVzIGNvcHkgKD14eHgpIG9yCisgIGRpcmVjdCAgKHh4eCkgaW5pdGlhbGl6YXRpb24uIDwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwcmU+dGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgdm9pZCBlYXQoVCk7PGJyPmludCB4IDsgLy8gaW5kZXRlcm1pbmF0ZSBpbml0aWFsIHZhbHVlLjxicj5zdGQ6OnN0cmluZyBzOyAvLyBkZWZhdWx0LWluaXRpYWxpemVkLjxicj5lYXQgKCBpbnQoKSApIDsgLy8gdmFsdWUtaW5pdGlhbGl6ZWQ8YnI+ZWF0ICggc3RkOjpzdHJpbmcoKSApIDsgLy8gdmFsdWUtaW5pdGlhbGl6ZWQ8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8aDQ+PGEgbmFtZT0idmFsdWVpbml0c3luIj52YWx1ZS1pbml0aWFsaXphdGlvbjwvYT4gc3ludGF4PC9oND4KKyAgICAgICAgICAgICAgICAgICAKKzxwPlZhbHVlIGluaXRpYWxpemF0aW9uIGlzIHNwZWNpZmllZCB1c2luZyAoKS4gSG93ZXZlciwgdGhlIGVtcHR5IHNldCBvZgorcGFyZW50aGVzZXMgaXMgbm90IHBlcm1pdHRlZCBieSB0aGUgc3ludGF4IG9mIGluaXRpYWxpemVycyBiZWNhdXNlIGl0IGlzCitwYXJzZWQgYXMgdGhlIGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24gdGFraW5nIG5vIGFyZ3VtZW50czogPC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT5pbnQgeCgpIDsgLy8gZGVjbGFyZXMgZnVuY3Rpb24gaW50KCopKCk8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8cD5UaHVzLCB0aGUgZW1wdHkgKCkgbXVzdCBiZSBwdXQgaW4gc29tZSBvdGhlciBpbml0aWFsaXphdGlvbiBjb250ZXh0LjwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwPk9uZSBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgY29weS1pbml0aWFsaXphdGlvbiBzeW50YXg6PC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT5pbnQgeCA9IGludCgpIDs8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8cD5UaGlzIHdvcmtzIHBlcmZlY3RseSBmaW5lIGZvciBQT0QgdHlwZXMuIEJ1dCBmb3Igbm9uLVBPRCBjbGFzcyB0eXBlcywKK2NvcHktaW5pdGlhbGl6YXRpb24gc2VhcmNoZXMgZm9yIGEgc3VpdGFibGUgY29uc3RydWN0b3IsIHdoaWNoIGNvdWxkIGJlLAorZm9yIGluc3RhbmNlLCB0aGUgY29weS1jb25zdHJ1Y3RvciAoaXQgYWxzbyBzZWFyY2hlcyBmb3IgYSBzdWl0YWJsZSBjb252ZXJzaW9uCitzZXF1ZW5jZSBidXQgdGhpcyBkb2Vzbid0IGFwcGx5IGluIHRoaXMgY29udGV4dCkuIEZvciBhbiBhcmJpdHJhcnkgdW5rbm93bgordHlwZSwgdXNpbmcgdGhpcyBzeW50YXggbWF5IG5vdCBoYXZlIHRoZSB2YWx1ZS1pbml0aWFsaXphdGlvbiBlZmZlY3QgaW50ZW5kZWQKK2JlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhIGNvcHkgZnJvbSBhIGRlZmF1bHQgY29uc3RydWN0ZWQgb2JqZWN0IGlzIGV4YWN0bHkKK3RoZSBzYW1lIGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3RlZCBvYmplY3QsIGFuZCB0aGUgY29tcGlsZXIgaXMgYWxsb3dlZCAoaW4KK3NvbWUgY2FzZXMpLCBidXQgbmV2ZXIgcmVxdWlyZWQgdG8sIG9wdGltaXplIHRoZSBjb3B5IGF3YXkuPC9wPgorICAgICAgICAgICAgICAgICAgIAorPHA+T25lIHBvc3NpYmxlIGdlbmVyaWMgc29sdXRpb24gaXMgdG8gdXNlIHZhbHVlLWluaXRpYWxpemF0aW9uIG9mIGEgbm9uIHN0YXRpYworZGF0YSBtZW1iZXI6PC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyA8YnI+c3RydWN0IFcgPGJyPns8YnI+ICAvLyB2YWx1ZS1pbml0aWFsaXphdGlvbiBvZiAnZGF0YScgaGVyZS48YnI+ICBXKCkgOiBkYXRhKCkge308YnI+ICBUIGRhdGEgOzxicj59IDs8YnI+VyZsdDtpbnQmZ3Q7IHcgOzxicj4vLyB3LmRhdGEgaXMgdmFsdWUtaW5pdGlhbGl6ZWQgZm9yIGFueSB0eXBlLiA8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8cD5UaGlzIGlzIHRoZSBzb2x1dGlvbiBhcyBpdCB3YXMgc3VwcGxpZWQgYnkgZWFybGllciB2ZXJzaW9ucyBvZiB0aGUKKzxjb2RlPnZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7PC9jb2RlPiB0ZW1wbGF0ZQorICAgICBjbGFzcy4gVW5mb3J0dW5hdGVseSB0aGlzIGFwcHJvYWNoIHN1ZmZlcmVkIGZyb20gdmFyaW91cyBjb21waWxlciBpc3N1ZXMuPC9wPgorCQkgCis8aDQ+PGEgbmFtZT0iY29tcGlsZXJfaXNzdWVzIj5jb21waWxlciBpc3N1ZXM8L2E+IDwvaDQ+CisKK1ZhcmlvdXMgY29tcGlsZXJzIGhhdmVuJ3QgeWV0IGZ1bGx5IGltcGxlbWVudGVkIHZhbHVlLWluaXRpYWxpemF0aW9uLgorU28gd2hlbiBhbiBvYmplY3Qgc2hvdWxkIGJlIDxlbT52YWx1ZS1pbml0aWFsaXplZDwvZW0+IChhY2NvcmRpbmcgdG8gdGhlIEMrKyBTdGFuZGFyZCksCitpdCA8ZW0+bWF5PC9lbT4gaW4gcHJhY3RpY2Ugc3RpbGwgYmUgbGVmdCB1bmluaXRpYWxpemVkLCBiZWNhdXNlIG9mIHRob3NlCitjb21waWxlciBpc3N1ZXMhIEl0J3MgaGFyZCB0byBtYWtlIGEgZ2VuZXJhbCBzdGF0ZW1lbnQgb24gd2hhdCB0aG9zZSBpc3N1ZXMKK2FyZSBsaWtlLCBiZWNhdXNlIHRoZXkgZGVwZW5kIG9uIHRoZSBjb21waWxlciB5b3UgYXJlIHVzaW5nLCBpdHMgdmVyc2lvbiBudW1iZXIsCithbmQgdGhlIHR5cGUgb2Ygb2JqZWN0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgdmFsdWUtaW5pdGlhbGl6ZWQuCitBbGwgY29tcGlsZXJzIHdlIGhhdmUgdGVzdGVkIHNvIGZhciBzdXBwb3J0IHZhbHVlLWluaXRpYWxpemF0aW9uIGZvciBhcml0aG1ldGljIHR5cGVzIHByb3Blcmx5LgorSG93ZXZlciwgdmFyaW91cyBjb21waWxlcnMgbWF5IGxlYXZlIHNvbWUgdHlwZXMgb2YgPGVtPmFnZ3JlZ2F0ZXM8L2VtPiB1bmluaXRpYWxpemVkLCB3aGVuIHRoZXkgCitzaG91bGQgYmUgdmFsdWUtaW5pdGlhbGl6ZWQuIFZhbHVlLWluaXRpYWxpemF0aW9uIG9mIG9iamVjdHMgb2YgYSBwb2ludGVyLXRvLW1lbWJlciB0eXBlIG1heSBhbHNvCitnbyB3cm9uZyBvbiB2YXJpb3VzIGNvbXBpbGVycy4gCis8L3A+Cis8cD4KK0F0IHRoZSBtb21lbnQgb2Ygd3JpdGluZywgTWF5IDIwMTAsIHRoZSBmb2xsb3dpbmcgcmVwb3J0ZWQgaXNzdWVzIHJlZ2FyZGluZyAKK3ZhbHVlLWluaXRpYWxpemF0aW9uIGFyZSBzdGlsbCB0aGVyZSBpbiBjdXJyZW50IGNvbXBpbGVyIHJlbGVhc2VzOgorPHVsPgorPGxpPgorPGEgaHJlZj0iaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvMTAwNzQ0Ij4KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEZlZWRiYWNrIElEIDEwMDc0NCwgVmFsdWUtaW5pdGlhbGl6YXRpb24gaW4gbmV3LWV4cHJlc3Npb248L2E+Cis8YnI+UmVwb3J0ZWQgYnkgUGF2ZWwgS3V6bmV0c292IChNZXRhQ29tbXVuaWNhdGlvbnMgRW5naW5lZXJpbmcpLCAyMDA1Cis8L2xpPjxsaT4KKzxhIGhyZWY9Imh0dHA6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vVmlzdWFsU3R1ZGlvL2ZlZWRiYWNrL2RldGFpbHMvNDg0Mjk1Ij4KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIEZlZWRiYWNrIElEIDQ4NDI5NSwgVkMrKyBkb2VzIG5vdCB2YWx1ZS1pbml0aWFsaXplIG1lbWJlcnMgb2YgZGVyaXZlZCBjbGFzc2VzIHdpdGhvdXQgdXNlci1kZWNsYXJlZCBjb25zdHJ1Y3RvcjwvYT4KKzxicj5SZXBvcnRlZCBieSBTeWx2ZXN0ZXIgSGVzcCwgMjAwOQorPC9saT48bGk+Cis8YSBocmVmPSJodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9WaXN1YWxTdHVkaW8vZmVlZGJhY2svZGV0YWlscy80OTk2MDYiPgorTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gRmVlZGJhY2sgSUQgNDk5NjA2LCBQcmVzZW5jZSBvZiBjb3B5IGNvbnN0cnVjdG9yIGJyZWFrcyBtZW1iZXIgY2xhc3MgaW5pdGlhbGl6YXRpb248L2E+Cis8YnI+UmVwb3J0ZWQgYnkgQWxleCBWYWt1bGVua28sIDIwMDkKKzwvbGk+PGxpPgorPGEgaHJlZj0iaHR0cDovL3FjLmVtYmFyY2FkZXJvLmNvbS93Yy9xY21haW4uYXNweD9kPTgzNzUxIj4KK0VtYmFyY2FkZXJvL0MrK0J1aWxkZXIgUmVwb3J0IDgzNzUxLCBWYWx1ZS1pbml0aWFsaXphdGlvbjogYXJyYXlzIHNob3VsZCBoYXZlIGVhY2ggZWxlbWVudCB2YWx1ZS1pbml0aWFsaXplZDwvYT4KKzxicj5SZXBvcnRlZCBieSBOaWVscyBEZWtrZXIgKExLRUIpLCAyMDEwCis8L2xpPjxsaT4KKzxhIGhyZWY9Imh0dHA6Ly9xYy5lbWJhcmNhZGVyby5jb20vd2MvcWNtYWluLmFzcHg/ZD04Mzg1MSI+CitFbWJhcmNhZGVyby9DKytCdWlsZGVyIFJlcG9ydCA4Mzg1MSwgVmFsdWUtaW5pdGlhbGl6ZWQgdGVtcG9yYXJ5IHRyaWdnZXJzIGludGVybmFsIGJhY2tlbmQgZXJyb3IgQzE3OTg8L2E+Cis8YnI+UmVwb3J0ZWQgYnkgTmllbHMgRGVra2VyLCAyMDEwCis8L2xpPjxsaT4KKzxhIGhyZWY9Imh0dHA6Ly9xYy5lbWJhcmNhZGVyby5jb20vd2MvcWNtYWluLmFzcHg/ZD04NDI3OSI+CitFbWJhcmNhZGVyby9DKytCdWlsZGVyIFJlcG9ydCA4NDI3OSwgSW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgKEYxMDA0KSwgdmFsdWUtaW5pdGlhbGl6aW5nIG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIGJ5ICJuZXcgVCgpIjwvYT4KKzxicj5SZXBvcnRlZCBieSBOaWVscyBEZWtrZXIsIDIwMTAKKzwvbGk+PGxpPgorU3VuIENSIDY5NDcwMTYsIFN1biA1LjEwIG1heSBmYWlsIHRvIHZhbHVlLWluaXRpYWxpemUgYW4gb2JqZWN0IG9mIGEgbm9uLVBPRCBhZ2dyZWdhdGUuCis8YnI+UmVwb3J0ZWQgdG8gU3RldmUgQ2xhbWFnZSBieSBOaWVscyBEZWtrZXIsIDIwMTAKKzwvbGk+PGxpPgorSUJNJ3MgWEwgVjEwLjEgYW5kIFYxMS4xIG1heSBmYWlsIHRvIHZhbHVlLWluaXRpYWxpemUgYSB0ZW1wb3Jhcnkgb2YgYSBub24tUE9EIGFnZ3JlZ2F0ZS4KKzxicj5SZXBvcnRlZCB0byBNaWNoYWVsIFdvbmcgYnkgTmllbHMgRGVra2VyLCAyMDEwCis8L2xpPjxsaT4KK0ludGVsIHN1cHBvcnQgaXNzdWUgNTg5ODMyLCBBdHRlbXB0IHRvIHZhbHVlLWluaXRpYWxpemUgcG9pbnRlci10by1tZW1iZXIgdHJpZ2dlcnMgaW50ZXJuYWwgZXJyb3IKK29uIEludGVsIDExLjEuCis8YnI+UmVwb3J0ZWQgYnkgSm9obiBNYWRkb2NrLCAyMDEwCis8L2xpPgorPC91bD4KK05vdGUgdGhhdCBhbGwga25vd24gR0NDIGlzc3VlcyByZWdhcmRpbmcgdmFsdWUtaW5pdGlhbGl6YXRpb24gYXJlCitmaXhlZCB3aXRoIEdDQyB2ZXJzaW9uIDQuNCwgaW5jbHVkaW5nCis8YSBocmVmPSJodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMTExIj5HQ0MgQnVnIDMwMTExPC9hPi4KK0NsYW5nIGFsc28gaGFzIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQgdmFsdWUtaW5pdGlhbGl6YXRpb24sIGFzIGZhciBhcyB3ZSBrbm93LAorbm93IHRoYXQgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTcxMzkiPkNsYW5nIEJ1ZyA3MTM5PC9hPiBpcyBmaXhlZC4gCis8L3A+PHA+CisKK05ldyB2ZXJzaW9ucyBvZiA8Y29kZT52YWx1ZV9pbml0aWFsaXplZDwvY29kZT4KKyhCb29zdCByZWxlYXNlIHZlcnNpb24gMS4zNSBvciBoaWdoZXIpCitvZmZlciBhIHdvcmthcm91bmQgdG8gdGhlc2UgaXNzdWVzOiA8Y29kZT52YWx1ZV9pbml0aWFsaXplZDwvY29kZT4gbWF5IG5vdyBjbGVhcgoraXRzIGludGVybmFsIGRhdGEsIHByaW9yIHRvIGNvbnN0cnVjdGluZyB0aGUgb2JqZWN0IHRoYXQgaXQgY29udGFpbnMuIEl0IHdpbGwgZG8KK3NvIGZvciB0aG9zZSBjb21waWxlcnMgdGhhdCBuZWVkIHRvIGhhdmUgc3VjaCBhIHdvcmthcm91bmQsIGJhc2VkIG9uIHRoZQorPGEgaHJlZj0iLi4vY29uZmlnL2RvYy9odG1sL2Jvb3N0X2NvbmZpZy9ib29zdF9tYWNyb19yZWZlcmVuY2UuaHRtbCNib29zdF9jb25maWcuYm9vc3RfbWFjcm9fcmVmZXJlbmNlLm1hY3Jvc190aGF0X2Rlc2NyaWJlX2RlZmVjdHMiCis+Y29tcGlsZXIgZGVmZWN0IG1hY3JvPC9hPiBCT09TVF9OT19DT01QTEVURV9WQUxVRV9JTklUSUFMSVpBVElPTi4KKzwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxoMj48YSBuYW1lPSJ0eXBlcyI+PC9hPlR5cGVzIGFuZCBvYmplY3RzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAKKzxoMj48YSBuYW1lPSJ2YWxfaW5pdCI+PGNvZGU+dGVtcGxhdGUgY2xhc3MgdmFsdWVfaW5pdGlhbGl6ZWQmbHQ7VCZndDs8L2NvZGU+PC9hPjwvaDI+CisgICAgICAgICAgICAgICAgICAgCis8cHJlPm5hbWVzcGFjZSBib29zdCB7PGJyPjxicj50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0Ozxicj5jbGFzcyB2YWx1ZV9pbml0aWFsaXplZDxicj57Cis8YnI+ICBwdWJsaWMgOgorPGJyPiAgICB2YWx1ZV9pbml0aWFsaXplZCgpIDogeCgpIHt9Cis8YnI+ICAgIG9wZXJhdG9yIFQgY29uc3QgJmFtcDsoKSBjb25zdCB7IHJldHVybiB4IDsgfQorPGJyPiAgICBvcGVyYXRvciBUJmFtcDsoKSB7IHJldHVybiB4IDsgfQorPGJyPiAgICBUIGNvbnN0ICZhbXA7ZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHggOyB9Cis8YnI+ICAgIFQmYW1wOyBkYXRhKCkgeyByZXR1cm4geCA7IH0KKzxicj4gICAgdm9pZCBzd2FwKCB2YWx1ZV9pbml0aWFsaXplZCZhbXA7ICk7Cis8YnI+Cis8YnI+ICBwcml2YXRlIDoKKzxicj4gICAgPGk+dW5zcGVjaWZpZWQ8L2k+IHggOworPGJyPn0gOworPGJyPgorPGJyPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7Cis8YnI+VCBjb25zdCZhbXA7IGdldCAoIHZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7IGNvbnN0JmFtcDsgeCApCis8YnI+eworPGJyPiAgcmV0dXJuIHguZGF0YSgpIDsKKzxicj59Cis8YnI+Cis8YnI+dGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsKKzxicj5UJmFtcDsgZ2V0ICggdmFsdWVfaW5pdGlhbGl6ZWQmbHQ7VCZndDsmYW1wOyB4ICkKKzxicj57Cis8YnI+ICByZXR1cm4geC5kYXRhKCkgOworPGJyPn0KKzxicj4KKzxicj50ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OworPGJyPnZvaWQgc3dhcCAoIHZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7JmFtcDsgbGhzLCB2YWx1ZV9pbml0aWFsaXplZCZsdDtUJmd0OyZhbXA7IHJocyApCis8YnI+eworPGJyPiAgbGhzLnN3YXAocmhzKSA7Cis8YnI+fQorPGJyPgorPGJyPn0gLy8gbmFtZXNwYWNlIGJvb3N0Cis8YnI+PC9wcmU+CisgICAgICAgICAgICAgICAgICAgIAorPHA+QW4gb2JqZWN0IG9mIHRoaXMgdGVtcGxhdGUgY2xhc3MgaXMgYSA8Y29kZT5UPC9jb2RlPi13cmFwcGVyIGNvbnZlcnRpYmxlIAorICAgIHRvIDxjb2RlPidUJmFtcDsnPC9jb2RlPiB3aG9zZSB3cmFwcGVkIG9iamVjdCAoZGF0YSBtZW1iZXIgb2YgdHlwZSA8Y29kZT5UPC9jb2RlPikgCisgICAgaXMgPGEgaHJlZj0iI3ZhbHVlaW5pdCI+dmFsdWUtaW5pdGlhbGl6ZWQ8L2E+IHVwb24gZGVmYXVsdC1pbml0aWFsaXphdGlvbiAKKyAgICBvZiB0aGlzIHdyYXBwZXIgY2xhc3M6IDwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwcmU+aW50IHplcm8gPSAwIDs8YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50Jmd0OyB4IDs8YnI+YXNzZXJ0ICggeCA9PSB6ZXJvICkgOzxicj48YnI+c3RkOjpzdHJpbmcgZGVmIDs8YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7IHN0ZDo6c3RyaW5nICZndDsgeSA7PGJyPmFzc2VydCAoIHkgPT0gZGVmICkgOzxicj48L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8cD5UaGUgcHVycG9zZSBvZiB0aGlzIHdyYXBwZXIgaXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgc3ludGF4IGZvciB2YWx1ZQorICAgICBpbml0aWFsaXphdGlvbiBvZiBzY2FsYXIsIHVuaW9uIGFuZCBjbGFzcyB0eXBlcyAoUE9EIGFuZCBub24tUE9EKSBzaW5jZQorICAgdGhlICBjb3JyZWN0IHN5bnRheCBmb3IgdmFsdWUgaW5pdGlhbGl6YXRpb24gdmFyaWVzIChzZWUgPGEKKyBocmVmPSIjdmFsdWVpbml0c3luIj52YWx1ZS1pbml0aWFsaXphdGlvbiBzeW50YXg8L2E+KTwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwPlRoZSB3cmFwcGVkIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgZWl0aGVyIHRocm91Z2ggdGhlIGNvbnZlcnNpb24gb3BlcmF0b3IKKyAgICAgPGNvZGU+VCZhbXA7PC9jb2RlPiwgdGhlIG1lbWJlciBmdW5jdGlvbiA8Y29kZT5kYXRhKCk8L2NvZGU+LCBvciB0aGUKK25vbi1tZW1iZXIgICAgZnVuY3Rpb24gPGNvZGU+Z2V0KCk8L2NvZGU+OiAgPC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT52b2lkIHdhdGNoKGludCk7PGJyPnZhbHVlX2luaXRpYWxpemVkJmx0O2ludCZndDsgeDsKKzxicj48YnI+d2F0Y2goeCkgOyAvLyBvcGVyYXRvciBUJmFtcDsgdXNlZC48YnI+d2F0Y2goeC5kYXRhKCkpOzxicj53YXRjaCggZ2V0KHgpICkgLy8gZnVuY3Rpb24gZ2V0KCkgdXNlZDwvcHJlPgorICAgICAgICAgICAgICAgICAgICAKKzxwPkJvdGggPGNvZGU+Y29uc3Q8L2NvZGU+IGFuZCBub24tPGNvZGU+Y29uc3Q8L2NvZGU+IG9iamVjdHMgY2FuIGJlIHdyYXBwZWQuIAorICAgIE11dGFibGUgb2JqZWN0cyBjYW4gYmUgbW9kaWZpZWQgZGlyZWN0bHkgZnJvbSB3aXRoaW4gdGhlIHdyYXBwZXIgYnV0IGNvbnN0YW50CisgICAgb2JqZWN0cyBjYW5ub3Q6PC9wPgorCis8cD5XaGVuIDxjb2RlPlQ8L2NvZGU+IGlzIGEgPGVtPlN3YXBwYWJsZTwvZW0+IHR5cGUsIDxjb2RlPnZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7PC9jb2RlPgorICAgIGlzIHN3YXBwYWJsZSBhcyB3ZWxsLCBieSBjYWxsaW5nIGl0cyA8Y29kZT5zd2FwPC9jb2RlPiBtZW1iZXIgZnVuY3Rpb24KKyAgICBhcyB3ZWxsIGFzIGJ5IGNhbGxpbmcgPGNvZGU+Ym9vc3Q6OnN3YXA8L2NvZGU+LjwvcD4KKyAgICAgICAgICAgICAgICAgICAKKzxwcmU+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50Jmd0OyB4IDsgPGJyPnN0YXRpY19jYXN0Jmx0O2ludCZhbXA7Jmd0Oyh4KSA9IDEgOyAvLyBPSzxicj5nZXQoeCkgPSAxIDsgLy8gT0sKKzxicj48YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50IGNvbnN0Jmd0OyB5IDsgPGJyPnN0YXRpY19jYXN0Jmx0O2ludCZhbXA7Jmd0Oyh5KSA9IDEgOyAvLyBFUlJPUjogY2Fubm90IGNhc3QgdG8gaW50JmFtcDs8YnI+c3RhdGljX2Nhc3QmbHQ7aW50IGNvbnN0JmFtcDsmZ3Q7KHkpID0gMSA7IC8vIEVSUk9SOiBjYW5ub3QgbW9kaWZ5IGEgY29uc3QgdmFsdWU8YnI+Z2V0KHkpID0gMSA7IC8vIEVSUk9SOiBjYW5ub3QgbW9kaWZ5IGEgY29uc3QgdmFsdWU8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8aDM+V2FybmluZzo8L2gzPgorICAgICAgICAgICAgICAgICAgIAorPHA+VGhlIDxjb2RlPnZhbHVlX2luaXRpYWxpemVkPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiBCb29zdCB2ZXJzaW9uIDEuNDAuMCBhbmQgb2xkZXIKK2FsbG93ZWQgPGk+bm9uLWNvbnN0PC9pPiBhY2Nlc3MgdG8gdGhlIHdyYXBwZWQgb2JqZWN0LCBmcm9tIGEgY29uc3RhbnQgd3JhcHBlciwKK2JvdGggYnkgaXRzIGNvbnZlcnNpb24gb3BlcmF0b3IgYW5kIGl0cyA8Y29kZT5kYXRhKCk8L2NvZGU+IG1lbWJlciBmdW5jdGlvbi4gRm9yIGV4YW1wbGU6PC9wPgorICAgICAgICAgICAgICAgICAgIAorPHByZT52YWx1ZV9pbml0aWFsaXplZCZsdDtpbnQmZ3Q7IGNvbnN0IHhfYyA7PGJyPmludCZhbXA7IHhyID0geF9jIDsgLy8gT0ssIGNvbnZlcnNpb24gdG8gaW50JmFtcDsgYXZhaWxhYmxlIGV2ZW4gdGhvdWdoIHhfYyBpcyBpdHNlbGYgY29uc3QuCis8YnI+eHIgPSAyIDsgPC9wcmU+CisgICAgICAgICAgICAgICAgICAgIAorPHA+VGhlIHJlYXNvbiBmb3IgdGhpcyBvYnNjdXJlIGJlaGF2aW9yIHdhcyB0aGF0IHNvbWUgY29tcGlsZXJzIAorICAgICBkaWRuJ3QgYWNjZXB0IHRoZSBmb2xsb3dpbmcgdmFsaWQgY29kZTo8L3A+CisgICAgICAgICAgICAgICAgICAgCis8cHJlPnN0cnVjdCBYPGJyPns8YnI+ICBvcGVyYXRvciBpbnQmYW1wOygpIDs8YnI+ICBvcGVyYXRvciBpbnQgY29uc3QmYW1wOygpIGNvbnN0IDsgICA8YnI+fTs8YnI+WCB4IDs8YnI+KHggPT0gMSApIDsgLy8gRVJST1IgSEVSRSE8L3ByZT4KKyAgICAgICAgICAgICAgICAgICAgCis8cD5UaGUgY3VycmVudCB2ZXJzaW9uIG9mIDxjb2RlPnZhbHVlX2luaXRpYWxpemVkPC9jb2RlPiBubyBsb25nZXIgaGFzIHRoaXMgb2JzY3VyZSBiZWhhdmlvci4KK0FzIGNvbXBpbGVycyBub3dhZGF5cyB3aWRlbHkgc3VwcG9ydCBvdmVybG9hZGluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBieSBoYXZpbmcgYSA8Y29kZT5jb25zdDwvY29kZT4gYW5kIGEgPGNvZGU+bm9uLWNvbnN0PC9jb2RlPiB2ZXJzaW9uLCB3ZSBoYXZlIGRlY2lkZWQgdG8gZml4IHRoZSBpc3N1ZSBhY2NvcmRpbmdseS4gU28gdGhlIGN1cnJlbnQgdmVyc2lvbiBzdXBwb3J0cyB0aGUgaWRlYSBvZiBsb2dpY2FsIGNvbnN0bmVzcy4KKzxicj4KKyAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgCis8aDM+UmVjb21tZW5kZWQgcHJhY3RpY2U6IFRoZSBub24tbWVtYmVyIGdldCgpIGlkaW9tPC9oMz4KKyAgICAgICAgICAgICAgICAgICAKKzxwPlRoZSBvYnNjdXJlIGJlaGF2aW9yIG9mIGJlaW5nIGFibGUgdG8gbW9kaWZ5IGEgbm9uLTxjb2RlPmNvbnN0PC9jb2RlPgord3JhcHBlZCBvYmplY3QgZnJvbSB3aXRoaW4gYSBjb25zdGFudCB3cmFwcGVyIChhcyB3YXMgc3VwcG9ydGVkIGJ5IHByZXZpb3VzCit2ZXJzaW9ucyBvZiA8Y29kZT52YWx1ZV9pbml0aWFsaXplZDwvY29kZT4pCitjYW4gYmUgYXZvaWRlZCBpZiBhY2Nlc3MgdG8KK3RoZSB3cmFwcGVkIG9iamVjdCBpcyBhbHdheXMgcGVyZm9ybWVkIHdpdGggdGhlIDxjb2RlPmdldCgpPC9jb2RlPiBpZGlvbTo8L3A+CisgICAgICAgICAgICAgICAgICAgCis8cHJlPnZhbHVlX2luaXRpYWxpemVkJmx0O2ludCZndDsgeCA7PGJyPmdldCh4KSA9IDEgOyAvLyBPSzxicj48YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50IGNvbnN0Jmd0OyBjeCA7PGJyPmdldCh4KSA9IDEgOyAvLyBFUlJPUjogQ2Fubm90IG1vZGlmeSBhIGNvbnN0IG9iamVjdDxicj48YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50Jmd0OyBjb25zdCB4X2MgOzxicj5nZXQoeF9jKSA9IDEgOyAvLyBFUlJPUjogQ2Fubm90IG1vZGlmeSBhIGNvbnN0IG9iamVjdDxicj48YnI+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7aW50IGNvbnN0Jmd0OyBjb25zdCBjeF9jIDs8YnI+Z2V0KGN4X2MpID0gMSA7IC8vIEVSUk9SOiBDYW5ub3QgbW9kaWZ5IGEgY29uc3Qgb2JqZWN0PGJyPjwvcHJlPgorCis8aDI+PGEgbmFtZT0iaW5pdGlhbGl6ZWQiPjxjb2RlPnRlbXBsYXRlIGNsYXNzIGluaXRpYWxpemVkJmx0O1QmZ3Q7PC9jb2RlPjwvYT48L2gyPgorICAgICAgICAgICAgICAgICAgIAorPHByZT5uYW1lc3BhY2UgYm9vc3Qgezxicj48YnI+dGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDs8YnI+Y2xhc3MgaW5pdGlhbGl6ZWQ8YnI+eworPGJyPiAgcHVibGljIDoKKzxicj4gICAgaW5pdGlhbGl6ZWQoKSA6IHgoKSB7fQorPGJyPiAgICBleHBsaWNpdCBpbml0aWFsaXplZChUIGNvbnN0ICZhbXA7IGFyZykgOiB4KGFyZykge30KKzxicj4gICAgb3BlcmF0b3IgVCBjb25zdCAmYW1wOygpIGNvbnN0OworPGJyPiAgICBvcGVyYXRvciBUJmFtcDsoKTsKKzxicj4gICAgVCBjb25zdCAmYW1wO2RhdGEoKSBjb25zdDsKKzxicj4gICAgVCZhbXA7IGRhdGEoKTsKKzxicj4gICAgdm9pZCBzd2FwKCBpbml0aWFsaXplZCZhbXA7ICk7Cis8YnI+Cis8YnI+ICBwcml2YXRlIDoKKzxicj4gICAgPGk+dW5zcGVjaWZpZWQ8L2k+IHggOworPGJyPn0gOworPGJyPgorPGJyPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7Cis8YnI+VCBjb25zdCZhbXA7IGdldCAoIGluaXRpYWxpemVkJmx0O1QmZ3Q7IGNvbnN0JmFtcDsgeCApOworPGJyPgorPGJyPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7Cis8YnI+VCZhbXA7IGdldCAoIGluaXRpYWxpemVkJmx0O1QmZ3Q7JmFtcDsgeCApOworPGJyPgorPGJyPnRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7Cis8YnI+dm9pZCBzd2FwICggaW5pdGlhbGl6ZWQmbHQ7VCZndDsmYW1wOyBsaHMsIGluaXRpYWxpemVkJmx0O1QmZ3Q7JmFtcDsgcmhzICk7Cis8YnI+Cis8YnI+fSAvLyBuYW1lc3BhY2UgYm9vc3QKKzxicj48L3ByZT4KKworVGhlIHRlbXBsYXRlIGNsYXNzIDxjb2RlPmJvb3N0Ojppbml0aWFsaXplZCZsdDtUJmd0OzwvY29kZT4gc3VwcG9ydHMgYm90aCB2YWx1ZS1pbml0aWFsaXphdGlvbgorYW5kIGRpcmVjdC1pbml0aWFsaXphdGlvbiwgc28gaXRzIGludGVyZmFjZSBpcyBhIHN1cGVyc2V0IG9mIHRoZSBpbnRlcmZhY2UKK29mIDxjb2RlPnZhbHVlX2luaXRpYWxpemVkJmx0O1QmZ3Q7PC9jb2RlPjogSXRzIGRlZmF1bHQtY29uc3RydWN0b3IgCit2YWx1ZS1pbml0aWFsaXplcyB0aGUgd3JhcHBlZCBvYmplY3QganVzdCBsaWtlIHRoZSBkZWZhdWx0LWNvbnN0cnVjdG9yIG9mCis8Y29kZT52YWx1ZV9pbml0aWFsaXplZCZsdDtUJmd0OzwvY29kZT4sIGJ1dCA8Y29kZT5ib29zdDo6aW5pdGlhbGl6ZWQmbHQ7VCZndDs8L2NvZGU+CithbHNvIG9mZmVycyBhbiBleHRyYSA8Y29kZT5leHBsaWNpdDwvY29kZT4KK2NvbnN0cnVjdG9yLCB3aGljaCBkaXJlY3QtaW5pdGlhbGl6ZXMgdGhlIHdyYXBwZWQgb2JqZWN0IGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCis8cD4KKworPGNvZGU+aW5pdGlhbGl6ZWQmbHQ7VCZndDs8L2NvZGU+IGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gdGhlIHdyYXBwZWQKK29iamVjdCBtdXN0IGJlIGVpdGhlciB2YWx1ZS1pbml0aWFsaXplZCBvciBkaXJlY3QtaW5pdGlhbGl6ZWQsIGRlcGVuZGluZyBvbgorcnVudGltZSBjb25kaXRpb25zLiBGb3IgZXhhbXBsZSwgPGNvZGU+aW5pdGlhbGl6ZWQmbHQ7VCZndDs8L2NvZGU+IGNvdWxkCitob2xkIHRoZSB2YWx1ZSBvZiBhIGRhdGEgbWVtYmVyIHRoYXQgbWF5IGJlIHZhbHVlLWluaXRpYWxpemVkIGJ5IHNvbWUKK2NvbnN0cnVjdG9ycywgYW5kIGRpcmVjdC1pbml0aWFsaXplZCBieSBvdGhlcnMuCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgaXQgaXMga25vd24gYmVmb3JlaGFuZCB0aGF0IHRoZQorb2JqZWN0IG11c3QgPGk+YWx3YXlzPC9pPiBiZSB2YWx1ZS1pbml0aWFsaXplZCwgPGNvZGU+dmFsdWVfaW5pdGlhbGl6ZWQmbHQ7VCZndDs8L2NvZGU+CittYXkgYmUgcHJlZmVyYWJsZS4gQW5kIGlmIHRoZSBvYmplY3QgbXVzdCBhbHdheXMgYmUKK2RpcmVjdC1pbml0aWFsaXplZCwgbm9uZSBvZiB0aGUgdHdvIHdyYXBwZXJzIHJlYWxseSBuZWVkcyB0byBiZSB1c2VkLgorPC9wPgorIAorCis8aDI+PGEgbmFtZT0iaW5pdGlhbGl6ZWRfdmFsdWUiPjxjb2RlPmluaXRpYWxpemVkX3ZhbHVlPC9jb2RlPjwvYT48L2gyPgorCis8cHJlPgorbmFtZXNwYWNlIGJvb3N0IHsKK2NsYXNzIGluaXRpYWxpemVkX3ZhbHVlX3QKK3sKKyAgcHVibGljIDoKKyAgICB0ZW1wbGF0ZSAmbHQ7Y2xhc3MgVCZndDsgb3BlcmF0b3IgVCgpIGNvbnN0IDsKK307CisKK2luaXRpYWxpemVkX3ZhbHVlX3QgY29uc3QgaW5pdGlhbGl6ZWRfdmFsdWUgPSB7fSA7CisKK30gLy8gbmFtZXNwYWNlIGJvb3N0Cis8L3ByZT4KKworPGNvZGU+aW5pdGlhbGl6ZWRfdmFsdWU8L2NvZGU+IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gZ2V0CithbiBpbml0aWFsaXplZCB2YWx1ZTogaXRzIGNvbnZlcnNpb24gb3BlcmF0b3IgcHJvdmlkZXMgYW4gYXBwcm9wcmlhdGUKKzxlbT52YWx1ZS1pbml0aWFsaXplZDwvZW0+IG9iamVjdCBmb3IgYW55IENvcHlDb25zdHJ1Y3RpYmxlIHR5cGUuCisKK1N1cHBvc2UgeW91IG5lZWQgdG8gaGF2ZSBhbiBpbml0aWFsaXplZCB2YXJpYWJsZSBvZiB0eXBlIDxjb2RlPlQ8L2NvZGU+LgorWW91IGNvdWxkIGRvIGl0IGFzIGZvbGxvd3M6Cis8cHJlPgorICBUIHZhciA9IFQoKTsKKzwvcHJlPgorQnV0IGFzIG1lbnRpb25lZCBiZWZvcmUsIHRoaXMgZm9ybSBzdWZmZXJzIGZyb20gdmFyaW91cyBjb21waWxlciBpc3N1ZXMuCitUaGUgdGVtcGxhdGUgPGNvZGU+dmFsdWVfaW5pdGlhbGl6ZWQ8L2NvZGU+IG9mZmVycyBhIHdvcmthcm91bmQ6Cis8cHJlPgorICBUIHZhciA9IGdldCggdmFsdWVfaW5pdGlhbGl6ZWQmbHQ7VCZndDsoKSApOworPC9wcmU+CitVbmZvcnR1bmF0ZWx5IGJvdGggZm9ybXMgcmVwZWF0IHRoZSB0eXBlIG5hbWUsIHdoaWNoCitpcyByYXRoZXIgc2hvcnQgbm93ICg8Y29kZT5UPC9jb2RlPiksIGJ1dCBjb3VsZCBvZiBjb3Vyc2UgYmUgCittb3JlIGxpa2UgPGNvZGU+TmFtZXNwYWNlOjpUZW1wbGF0ZSZsdDtBcmcmZ3Q7OjpUeXBlPC9jb2RlPi4KK0luc3RlYWQsIG9uZSBjb3VsZCB1c2UgPGNvZGU+aW5pdGlhbGl6ZWRfdmFsdWU8L2NvZGU+IGFzIGZvbGxvd3M6Cis8cHJlPgorICBUIHZhciA9IGluaXRpYWxpemVkX3ZhbHVlIDsKKzwvcHJlPgorICAgICAgICAgICAgICAgICAgICAKKzxoMz48YSBuYW1lPSJyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPjwvaDM+CisgICAgICAgICAgWzFdIEJqYXJuZSBTdHJvdXN0cnVwLCBHYWJyaWVsIERvcyBSZWlzLCBhbmQgSi4gU3RlcGhlbiBBZGFtY3p5ayB3cm90ZQorICAgICAgICAgIHZhcmlvdXMgcGFwZXJzLCBwcm9wb3NpbmcgdG8gZXh0ZW5kIHRoZSBzdXBwb3J0IGZvciBicmFjZS1lbmNsb3NlZCA8ZW0+aW5pdGlhbGl6ZXIgbGlzdHM8L2VtPgorICAgICAgICAgIGluIHRoZSBuZXh0IHZlcnNpb24gb2YgQysrLgorICAgICAgICAgIFRoaXMgd291bGQgYWxsb3cgYSB2YXJpYWJsZSA8Y29kZT52YXI8L2NvZGU+IG9mIGFueSBEZWZhdWx0Q29uc3RydWN0aWJsZSB0eXBlCisgICAgICAgICAgPGNvZGU+VDwvY29kZT4gdG8gYmUgPGVtPnZhbHVlLWluaXRpYWxpemVkPC9lbT4gYnkgZG9pbmcgPGNvZGU+VCB2YXIgPSB7fTwvY29kZT4uCisgICAgICAgICAgVGhlIHBhcGVycyBhcmUgbGlzdGVkIGF0IEJqYXJuZSdzIHdlYiBwYWdlLAorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cucmVzZWFyY2guYXR0LmNvbS9+YnMvV0cyMS5odG1sIj5NeSBDKysgU3RhbmRhcmRzIGNvbW1pdHRlZSBwYXBlcnM8L2E+ICA8YnI+IAorICAgICAgICAgIFsyXSBTY290dCBNZXllcnMsIEVmZmVjdGl2ZSBDKyssIFRoaXJkIEVkaXRpb24sIGl0ZW0gNiwKKyAgICAgICAgICA8ZW0+RXhwbGljaXRseSBkaXNhbGxvdyB0aGUgdXNlIG9mIGNvbXBpbGVyLWdlbmVyYXRlZCBmdW5jdGlvbnMgeW91IGRvIG5vdCB3YW50PC9lbT4sIAorICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXJpc3RlaWEuY29tL2Jvb2tzLmh0bWwiPlNjb3R0IE1leWVyczogQm9va3MgYW5kIENEczwvYT4gIDxicj4KKyAgICAgICAgICBbM10gVGhlIEMrKyBTdGFuZGFyZCwgU2Vjb25kIGVkaXRpb24gKDIwMDMpLCBJU08vSUVDIDE0ODgyOjIwMDMgPGJyPgorICAgICAgICAgIFs0XSBQT0Qgc3RhbmRzIGZvciAiUGxhaW4gT2xkIERhdGEiCisKKzxoMz48YSBuYW1lPSJhY2tub3dsZWRnZW1lbnRzIj48L2E+QWNrbm93bGVkZ2VtZW50czwvaDM+CisgICAgIHZhbHVlX2luaXRpYWxpemVkIHdhcyBkZXZlbG9wZWQgYnkgRmVybmFuZG8gQ2FjY2lvbGEsIHdpdGggaGVscCBhbmQKK3N1Z2dlc3Rpb25zIGZyb20gRGF2aWQgQWJyYWhhbXMgYW5kIERhcmluIEFkbGVyLjxicj4KK1NwZWNpYWwgdGhhbmtzIHRvIEJqJm91bWw7cm4gS2FybHNzb24gd2hvIGNhcmVmdWxseSBlZGl0ZWQgYW5kIGNvbXBsZXRlZCB0aGlzIGRvY3VtZW50YXRpb24uCisgICAgICAgICAgICAgICAgIAorPHA+dmFsdWVfaW5pdGlhbGl6ZWQgd2FzIHJlaW1wbGVtZW50ZWQgYnkgRmVybmFuZG8gQ2FjY2lvbGEgYW5kIE5pZWxzIERla2tlcgorZm9yIEJvb3N0IHJlbGVhc2UgdmVyc2lvbiAxLjM1ICgyMDA4KSwgb2ZmZXJpbmcgYSB3b3JrYXJvdW5kIHRvIHZhcmlvdXMgY29tcGlsZXIgaXNzdWVzLgorICAgICA8L3A+Cis8cD48Y29kZT5ib29zdDo6aW5pdGlhbGl6ZWQ8L2NvZGU+IHdhcyB2ZXJ5IG11Y2ggaW5zcGlyZWQgYnkgZmVlZGJhY2sgZnJvbSBFZHdhcmQgRGllbmVyIGFuZCAKKyAgSmVmZnJleSBIZWxscnVuZy4KKyAgICAgPC9wPgorPHA+aW5pdGlhbGl6ZWRfdmFsdWUgd2FzIHdyaXR0ZW4gYnkgTmllbHMgRGVra2VyLCBhbmQgYWRkZWQgdG8gQm9vc3QgcmVsZWFzZSB2ZXJzaW9uIDEuMzYgKDIwMDgpLgorICAgICA8L3A+Cis8cD5EZXZlbG9wZWQgYnkgPGEgaHJlZj0ibWFpbHRvOmZlcm5hbmRvX2NhY2Npb2xhQGhvdG1haWwuY29tIj5GZXJuYW5kbyBDYWNjaW9sYTwvYT4sCisgICAgIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0IDxhCisgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmciPnd3dy5ib29zdC5vcmc8L2E+LgorICAgICA8L3A+CisgICAgICAgICAgICAgICAgICAgIAorPGhyPiAgICAgICAgICAKKzxwPlJldmlzZWQgMzAgTWF5IDIwMTA8L3A+CisgICAgICAgICAgICAgICAgICAgCis8cD4mY29weTsgQ29weXJpZ2h0IEZlcm5hbmRvIENhY2Npb2xhLCAyMDAyIC0gMjAxMC48L3A+CisgICAgICAgICAgICAgICAgICAgCis8cD5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIFNlZQorPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT48L3A+CisKKyA8YnI+CisgPGJyPgorICAgIAorPC9ib2R5PgorPC9odG1sPgo=